在线程程序中什么时候使用Invoke?
In threading program when do you use Invoke?
示例代码:
private void button1_Click(object sender, EventArgs e)
{
Thread r= new Thread(new ThreadStart(DoWork));
r.Start();
}
private void DoWork()
{
MessageBox.Show("test");
Thread.Sleep(2000);
}
开发人员何时会将 MessageBox
代码替换为:
this.Invoke(new Action(() => { MessageBox.Show(this, "test"); }));
当您需要在 GUI 线程上 运行 编码时,您可以使用 Invoke
。不多也不少。
关于你的最后一个问题,我能想到的唯一原因是当你想阻塞你的 GUI 线程,直到用户单击消息框。 不需要。
当您需要在 UI 线程上执行操作时,您可以使用 this.Invoke
。
例如,如果您要更新 UI 元素,则需要在主 UI 线程上执行。
否则你会得到如下异常:
Cross-thread operation not valid: Control accessed from a thread other
than the thread it was created on.
在你的例子中,显然没有必要使用 Invoke
示例代码:
private void button1_Click(object sender, EventArgs e)
{
Thread r= new Thread(new ThreadStart(DoWork));
r.Start();
}
private void DoWork()
{
MessageBox.Show("test");
Thread.Sleep(2000);
}
开发人员何时会将 MessageBox
代码替换为:
this.Invoke(new Action(() => { MessageBox.Show(this, "test"); }));
当您需要在 GUI 线程上 运行 编码时,您可以使用 Invoke
。不多也不少。
关于你的最后一个问题,我能想到的唯一原因是当你想阻塞你的 GUI 线程,直到用户单击消息框。 不需要。
当您需要在 UI 线程上执行操作时,您可以使用 this.Invoke
。
例如,如果您要更新 UI 元素,则需要在主 UI 线程上执行。
否则你会得到如下异常:
Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on.
在你的例子中,显然没有必要使用 Invoke