为什么非UI线程能够在WinForm&中修改UI控件? TPL?

时间:2011-09-23 00:10:23

标签: .net winforms task task-parallel-library

我正在测试我在下面写的一段TPL代码。两个ManagedThreadId显示不同的数字。因此,我假设新任务是在非UI线程上运行。

我的问题是该任务如何能够显示消息并更改UI控件?我错过了什么。我想我需要获得对UI的SynchronizationContext的引用,并使用它来从其他线程进行UI更改。

//var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString());

Task testTask = new Task(() => {
        MessageBox.Show(
            Thread.CurrentThread.ManagedThreadId.ToString());
        lblTest.Text = "Test";
    });
testTask.Start();

增加:

下载VS解决方案here

添加2

有人可以测试解决方案并提及他们是否得到例外吗?

1 个答案:

答案 0 :(得分:3)

除非您使用Control.CheckForIllegalCrossThreadCalls属性指示运行时不要验证调用线程是否与创建控件的线程匹配,否则将无法正常工作

在一个全新的WinForms项目中,我的测试代码确实崩溃了(InvalidOperationException:跨线程操作无效:从创建它的线程以外的线程访问控制'lblTest')。是否有可能在您的环境中应用CheckForIllegalCrossThreadCalls(false)?

Getting exception with your source code