为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
繁花不似锦 2021-07-09 17:43:55
以下代码抽象出我的实际任务,即遍历位图中的每个像素。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)


查看完整回答
反对 回复 2021-07-17
  • 2 回答
  • 0 关注
  • 189 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信