gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:13:24 25 4
gpt4 key购买 nike

我正在测试我在下面编写的一段 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

有人可以测试解决方案并提及他们是否有异常吗?

最佳答案

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

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

Getting exception with your source code

关于.net - 为什么非 UI 线程能够在 WinForm & TPL 中修改 UI 控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7522933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com