C# 交叉线程操作

C# 交叉线程操作,c#,multithreading,C#,Multithreading,有人能告诉我if和else语句在这个函数中是如何关联的吗。我正在显示从另一个线程到GUI线程的文本。执行的顺序或方式是什么。是否需要else声明 delegate void SetTextCallback(string text); private void SetText(string text) { // InvokeRequired required compares the thread ID of the // calling thre

有人能告诉我if和else语句在这个函数中是如何关联的吗。我正在显示从另一个线程到GUI线程的文本。执行的顺序或方式是什么。是否需要else声明

delegate void SetTextCallback(string text);

    private void SetText(string text)
    {
        // InvokeRequired required compares the thread ID of the
        // calling thread to the thread ID of the creating thread.
        // If these threads are different, it returns true.
        if (this.textBox7.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(SetText);
            this.Invoke(d, new object[] { text });
        }
        else
        {
            this.textBox7.Text = text;
        }
    }

invokererequired
用于检查语句是在主UI线程中执行,还是在UI线程以外的其他线程中执行


如果语句是在UI线程以外的其他线程中执行的,
Invoke
用于不导致任何
交叉线程
异常。

否则肯定是必要的

此代码允许您从任何线程安全地调用
SetText
。如果从UI线程以外的线程调用它(
If
block),它会透明地将调用转发到UI线程(
else
block),该线程是唯一可以访问控件以读取或设置其文本的线程

如果不在UI线程上执行,盲目地使用
this.textBox7.Text将导致异常

  • 另一个线程调用SetText
  • 因为创建表单的不是线程,所以它需要调用
    Invoke
  • this.Invoke
    再次使用给定参数调用SetText。也检查
  • 现在,SetText是从UI线程调用的,无需调用
  • else
    块中,我们确保文本设置为线程安全

  • 除了其他答案之外,这是一种常见的模式(特别是在被调用的方法包含大量逻辑的情况下)-如果
    InvokeRequired
    返回true,则从UI线程调用同一方法:

    private void SetText(string text)
    {
        if (InvokeRequired)
            BeginInvoke(new Action<string>((t) => SetText(text)));
        else
            textBox7.Text = text;
    }
    
    private void SetText(字符串文本)
    {
    如果(需要调用)
    BeginInvoke(新动作((t)=>SetText(文本));
    其他的
    textBox7.Text=文本;
    }
    

    这样,您就不必在
    if
    else

    中重复逻辑,如果没有
    else
    ,程序很可能会崩溃,这是因为您无法从外部线程更改GUI。由于无论如何都需要更改GUI,因此可以调用该方法。如果没有
    else
    ,外部线程将在调用该方法后立即尝试更改GUI(导致我前面提到的崩溃)
    invokererequired
    检查对象是否属于当前线程,基本上这意味着
    this.textBox7.Text=TexttextBox7
    所属的线程外,code>永远不会在任何线程上运行。谢谢,它真的很有帮助!谢谢,真的很有帮助!谢谢,真的很有帮助!谢谢,真的很有帮助!