【问题标题】:In threading program when do you use Invoke?在线程程序中什么时候使用 Invoke?
【发布时间】:2015-05-04 04:28:19
【问题描述】:

示例代码:

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"); }));

【问题讨论】:

    标签: c# multithreading invoke


    【解决方案1】:

    当您需要在 UI 线程上执行操作时,您可以使用 this.Invoke

    例如,如果您要更新 UI 元素,则需要在主 UI 线程上执行。

    否则你会得到一个例外:

    跨线程操作无效:从其他线程访问的控件 比创建它的线程。

    在你的例子中,显然没有必要使用Invoke

    【讨论】:

    • 当我使用没有调用的代码时,消息框也会显示出来..是否只是更新文本框控件、标签控件等内容?
    • 对不起,我只是学习这个概念。。它只是为了更新文本框控件、标签控件和其他表单控件之类的东西吗?
    • 它与设计为单线程的 Win32 或 COM 对象交互。纯 .NET 控件没有这个弱点。
    • MessageBox 不属于 UI 线程,因此无论哪种方式都可以工作。例如,尝试从另一个线程向 ComboxBox 添加一个项目,您会发现它不起作用。
    • @helloworld 是的,正如你所说,它只是从另一个线程更新表单拥有的控件。
    【解决方案2】:

    当您需要在 GUI 线程上运行代码时,您可以使用 Invoke。不多不少。

    至于你的最后一个问题,我能想到的唯一原因是你想阻止你的 GUI 线程,直到用户点击消息框。没有需要

    【讨论】:

    • 我会争论“不多不少”。有时您确实想在 GUI 线程上执行,但不使用 Invoke,而是使用 BeginInvoke,这不会阻塞调用 [removed: GUI] 线程。
    • 哦...它阻塞 UI 线程 - 只是不是当前线程
    • @user2588666,当然会,不会阻塞调用线程。
    猜你喜欢
    • 1970-01-01
    • 2014-05-03
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多