以下代码抽象出我的实际任务,即遍历位图中的每个像素。
myButtonCommand.execute(async () => {
await Task.Run(() => {
while(i++<1000000) {
// do some work
if(i % 1000 == 0) // only update on every 1000th iteration
{
ProgressChanged.Invoke(this, i); // fire update event
Thread.Sleep(n);
}
}
});
});
提供给myButtomCommand.execute在 UI 线程上运行的 lambda 。但是由于不能保证任务在 UI 线程上运行,这是否意味着调用Thread.Sleep(n)可能会冻结 UI 线程?
潜在的问题是我需要更新进度条,Thread.Sleep(n)并且在任务旋转时 UI 线程被阻塞。
现在,我最终做的是使用,Thread.Sleep(0)因此只有在另一个线程需要运行时它才会进入睡眠状态。但我不明白为什么Thread.Sleep(n)首先需要使用,因为至少在我的测试中,它无论如何都在一个单独的线程上。
所以我对两件事感到困惑:
Thread.Sleep(n)
从 UI 线程外的 Task调用是否安全?
在我的示例中,Thread.Sleep(n)
鉴于任务在单独的线程上运行,为什么需要更新 UI?
慕的地6264312
相关分类