从 UI 线程的任务调用 Thread.Sleep(n) 可以冻结 UI 吗?

以下代码抽象出我的实际任务,即遍历位图中的每个像素。


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)首先需要使用,因为至少在我的测试中,它无论如何都在一个单独的线程上。


所以我对两件事感到困惑:

  1. Thread.Sleep(n)从 UI 线程外的 Task调用是否安全?

  2. 在我的示例中,Thread.Sleep(n)鉴于任务在单独的线程上运行,为什么需要更新 UI?


繁花不似锦
浏览 191回答 2
2回答

慕的地6264312

并且如果不执行 Thread.Sleep(n),则在任务旋转时 UI 线程会被阻塞。这意味着你只是在这里调用了太多的 Invokes。GUI 线程没有被“阻塞”,只是过度工作。另一种可能更好的方法&nbsp;//if(i&nbsp;%&nbsp;1000&nbsp;==&nbsp;0)&nbsp; &nbsp;&nbsp;&nbsp;if(i&nbsp;%&nbsp;1000000&nbsp;==&nbsp;0)
打开App,查看更多内容
随时随地看视频慕课网APP