gpt4 book ai didi

c# - Task.Parallel 更新 UI。为什么这样?

转载 作者:行者123 更新时间:2023-11-30 19:37:05 25 4
gpt4 key购买 nike

我可以从代码 1 更新 UI,但不能从代码 2 更新。

代码 1

   Parallel.ForEach(names, name =>
{
lblText.Text += "\n" + name + " Thread " + Thread.CurrentThread.ManagedThreadId;
});

代码 2

 Task.Factory.StartNew(() =>
{
Parallel.ForEach(names, name =>
{
lblText.Text += "\n" + name + " Thread " + Thread.CurrentThread.ManagedThreadId;
});
});

我知道代码 2 不会更新 UI,因为它是辅助线程。但是为什么代码 1 正在更新 UI? Parallel foreach 不运行不同的线程吗?如果是那么为什么要更新 UI?

代码1的输出

enter image description here

最佳答案

两个代码段都有效……真的。

问题是第一个代码块在阻塞 UI 线程时运行。第二个代码块启动任务,然后继续。

问题不在于使用多线程,因为两个示例都使用多线程来更改标签的值。问题出在表单的状态。

我假设您在表单构造函数中运行代码。在第一种情况下,没有创建句柄,因此操作不需要 UI 线程。它只是更新支持值。在第二种情况下,在创建任务所需的毫秒间,它会创建表单的句柄。当它需要更新标签时操作需要 UI 线程

如果您在任务中加入Wait,您会发现它也能正常工作。如果将代码移动到 OnHandleCreated,这两个语句都会失败。

关于c# - Task.Parallel 更新 UI。为什么这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39641901/

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