.net 为什么非UI线程能够在WinForm&;中修改UI控件;第三方物流?

.net 为什么非UI线程能够在WinForm&;中修改UI控件;第三方物流?,.net,winforms,task,task-parallel-library,.net,Winforms,Task,Task Parallel Library,我在测试我在下面写的一段TPL代码。这两个ManagedThreadId显示不同的数字。因此,我假设新任务是在非UI线程上运行的 我的问题是任务如何显示消息和更改UI控件?我错过了一些东西。我认为我需要获取对UI的SynchronizationContext的引用,并使用它从其他线程进行UI更改 //var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); MessageBox.Show(Thread.Current

我在测试我在下面写的一段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解决方案

添加2

是否有人可以测试该解决方案并说明是否出现异常?

除非您使用该属性指示运行时不要验证调用线程是否与创建控件的线程匹配,否则这将不起作用

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


为什么要进行“驾车向下”投票?对我来说似乎是个合理的问题。代码在按钮的点击处理程序中。我没有发现任何错误。我看到两个消息框和标签的文本更改。这是VS 2010 Windows 7 64位中的Winform应用程序。表单只有按钮和标签。您可以下载解决方案。请参阅上面的链接。@Tony:我在Windows 7 64位上使用VS 2010 SP1,创建了一个空的WinForms项目,添加了一个按钮和标签,并将代码放在按钮的单击处理程序上。你能用一个空项目复制吗?上面的下载链接基于一个空项目。我在两台不同的机器上试用了它,效果很好。@Tony:我在运行源代码时遇到了相同的异常(请参见添加到答案中的图片)。当我在没有调试的情况下运行时,标签变为“测试”。使用调试器运行时,标签不会更改。在这两种情况下,我都没有任何例外。你的行为有道理。我使用了两台不同的计算机(VS2010SP1和Windows7 64位),它们的行为方式与我描述的相同。你能理解为什么你和我的行为不同吗?