這個問題在這里已經有了答案: 如果我不在 WinForms 上使用 Thread.Sleep,BackgroundWorker 將無法作業 (1 個回答) 9 天前關閉。
我最近開始學習 async-await,我構建了一個簡單的應用程式來練習,現在我想運行一個 for 回圈,然后在每個回圈中,我想將i回圈的電流附加到我的textbox.Text, 和我希望它異步運行
我無法直接運行 async 方法,因為它會抱怨控制元件正在被與主執行緒不同的執行緒更改,所以我發現我必須使用BackgroundWorker該類,但是在DoWork這個 BgWorker的事件處理程式中,我必須使用thread.sleep()使其異步運行,以便在 for 回圈運行時我的 UI 保持回應,如果我洗掉thread.sleep(),UI 將凍結幾秒鐘,然后它立即寫出整個內容,如果我不這樣做怎么辦不想要thread.sleep()嗎?為什么需要它?它是如何作業的?我可以讓它異步運行但沒有thread.sleep()嗎?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i <= 1000; i )
{
Thread.Sleep(100); // Why is this required in order to run asynchronously
backgroundWorker1.ReportProgress(i);
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
textBox2.Text = e.ProgressPercentage;
}
}
uj5u.com熱心網友回復:
如果不呼叫Thread.Sleep(100),UI 執行緒將無法回應您的輸入,因為它一直忙于更新 UI。
Worker 執行緒將backgroundWorker1.ReportProgress(i)立即啟動并呼叫。這將呼叫 UI 執行緒來更新文本框并重新繪制對話框。完成此操作后,它基本上會立即backgroundWorker1.ReportProgress(i)再次呼叫并呼叫完全相同的內容。
這意味著 UI 執行緒不會檢查來自用戶輸入的事件,而是不斷更新文本框并重新繪制對話框。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318796.html
上一篇:異步方法中的型別不匹配
下一篇:Kotlin協程有顏色嗎?
