C# 交叉线程操作
有人能告诉我if和else语句在这个函数中是如何关联的吗。我正在显示从另一个线程到GUI线程的文本。执行的顺序或方式是什么。是否需要else声明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
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=Text除了textBox7
所属的线程外,code>永远不会在任何线程上运行。谢谢,它真的很有帮助!谢谢,真的很有帮助!谢谢,真的很有帮助!谢谢,真的很有帮助!