以下代码抽象出我的实际任务,即遍历位图中的每个像素。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?
2 回答
慕的地6264312
TA贡献1817条经验 获得超6个赞
并且如果不执行 Thread.Sleep(n),则在任务旋转时 UI 线程会被阻塞。
这意味着你只是在这里调用了太多的 Invokes。
GUI 线程没有被“阻塞”,只是过度工作。
另一种可能更好的方法
//if(i % 1000 == 0) if(i % 1000000 == 0)
- 2 回答
- 0 关注
- 189 浏览
添加回答
举报
0/150
提交
取消