以下代碼抽象出我的實際任務,即遍歷位圖中的每個像素。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 線程被阻塞?,F在,我最終做的是使用,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 關注
- 214 瀏覽
添加回答
舉報
0/150
提交
取消