Ank*_*ain 2 c# multithreading task task-parallel-library
我可以从代码1更新UI,但不能从2更新.
代码1
Parallel.ForEach(names, name =>
{
lblText.Text += "\n" + name + " Thread " + Thread.CurrentThread.ManagedThreadId;
});
Run Code Online (Sandbox Code Playgroud)
代码2
Task.Factory.StartNew(() =>
{
Parallel.ForEach(names, name =>
{
lblText.Text += "\n" + name + " Thread " + Thread.CurrentThread.ManagedThreadId;
});
});
Run Code Online (Sandbox Code Playgroud)
我知道代码2不会更新UI,因为它是一个辅助线程.但为什么代码1正在更新UI?不要并行foreach运行不同的线程?如果是,那么为什么要更新UI?
代码输出1
两个代码段都有效...真的.
问题是第一个代码块在阻塞UI线程时运行.第二个代码块启动任务然后继续.
问题不在于使用多个线程,因为这两个示例都使用多个线程来更改标签的值.问题在于形式的状态.
我假设你在表单构造函数中运行代码.在第一种情况下,没有创建句柄,因此操作不需要UI线程.它只是更新后备值.在第二种情况下,在分裂毫秒中它需要创建任务,它为表单创建句柄.当需要更新标签时,操作需要UI线程.
如果您Wait输入任务,您将看到它也会起作用.如果将代码移动到OnHandleCreated,则两个语句都将失败.