我正在测试我在下面写的一段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
有人可以测试解决方案并提及他们是否得到例外吗?
答案 0 :(得分:3)
除非您使用Control.CheckForIllegalCrossThreadCalls属性指示运行时不要验证调用线程是否与创建控件的线程匹配,否则将无法正常工作
在一个全新的WinForms项目中,我的测试代码确实崩溃了(InvalidOperationException:跨线程操作无效:从创建它的线程以外的线程访问控制'lblTest')。是否有可能在您的环境中应用CheckForIllegalCrossThreadCalls(false)?