3

谁能告诉我 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;
        }
    }
4

4 回答 4

4
  1. 另一个线程调用 SetText
  2. 因为它不是创建它需要的表单的线程Invoke
  3. this.Invoke再次使用给定参数调用 SetText。还要检查这个
  4. 现在从 UI 线程调用 SetText,不需要 Invoke
  5. else块中,我们确定文本已安全设置线程
于 2013-02-05T09:53:41.540 回答
2

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

如果语句在 UI 线程之外的其他线程中执行,Invoke则用于不引起任何CrossThread异常。

于 2013-02-05T09:52:07.470 回答
2

else绝对是必要的。

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

如果没有在 UI 线程上完成,盲目地进行this.textBox7.Text将会导致异常。

于 2013-02-05T09:52:28.143 回答
1

只是为了添加其他答案,这是一种常见模式(尤其是在被调用方法包含大量逻辑的情况下) - 如果InvokeRequired返回 true,则从 UI 线程回调到相同的方法:

private void SetText(string text)
{
    if (InvokeRequired)
        BeginInvoke(new Action<string>((t) => SetText(text)));
    else
        textBox7.Text = text;
}

这样您就不必在 和 中重复您的if逻辑else

于 2013-02-05T09:57:17.353 回答