クロススレッドのアクセス制御でWinフォーム。有効ではないスレッド間の操作:コントロールが作成されていないスレッドからアクセス

たとえば、そこにあるLabelという名前のコントロールLbl_Cnt
ボタンBtn_Start新しいスレッドで、それ(第2 +1当たりのカウント数)を更新するには、このエラーが発生する可能性があります

/// <summary>
/// 计数每秒+1
/// </summary>
private void Btn_Start_Click(object sender, EventArgs e)
{
    Task.Run(() =>
    {
        while (int.TryParse(Lbl_cnt.Text, out int curCnt))
        {
            Thread.Sleep(1000);
            Lbl_cnt.Text = (++curCnt).ToString();
        }
    });
}

コントロールを使用ControlしてInvoke

/// <summary>
/// 计数每秒+1
/// </summary>
private void Btn_Start_Click(object sender, EventArgs e)
{
    Task.Run(() =>
    {
        while (int.TryParse(Lbl_cnt.Text, out int curCnt))
        {
            Thread.Sleep(1000);
            //Lbl_cnt.Text = (++curCnt).ToString();
            Lbl_cnt.Invoke(new Action<int>(s =>
            {
                Lbl_cnt.Text = (++s).ToString();
            }), curCnt);
        }
    });
}

テキストは、各アップデートので、少しトラブルがあればことは明らかである
、拡張メソッドを使用することを検討して、その基本クラスで使用されますControl

/// <summary>
/// 跨线程设置文本内容
/// 比如每次更新都在原有文本加上时间戳
/// </summary>
/// <param name="control"></param>
public static void SetTextWithInvoke(this Control control, string str)
{
	//获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中
    if (control.InvokeRequired)
    {
        control.Invoke(new Action<string>(s =>
        {
        	//$""是一种语法糖,相当于简化的string.Format方法
            control.Text += $"【{DateTime.Now}】:{s}{Environment.NewLine}";
        }), str);
        return;
    }
    control.Text += $"【{DateTime.Now}】:{str}{Environment.NewLine}";
}

この拡張上記の方法では、から継承されたすべてのControl更新すべき基本的なコントロールはText、このメソッドを使用することができ
、例えば:

/// <summary>
/// 计数每秒+1,使用扩展方法
/// </summary>
private void Btn_Start_Click(object sender, EventArgs e)
{
    Task.Run(() =>
    {
        while (int.TryParse(Lbl_cnt.Text, out int curCnt))
        {
            Thread.Sleep(1000);
            Lbl_Cnt.SetTextWithInvoke(++curCnt);	//直接调用就行 无需关系是否跨线程访问
        }
    });
}
公開された62元の記事 ウォン称賛68 ビュー160 000 +

おすすめ

転載: blog.csdn.net/ZUFE_ZXh/article/details/104520221