[英]C# background worker frozen the GUI
我正在嘗試使用后台工作程序連續更新文本標簽,但是對於DoWork,如果不使用循環,它將僅執行一次,但是如果使用無限循環,它將凍結GUI,您有解決此問題的想法嗎? 萬分感激!!! 我是C#的新手,但仍在嘗試學習。
這是我的代碼:
其主要形式為:
backgroundWorkerX.DoWork += backgroundWorkerX_DoWork;
backgroundWorkerX.ProgressChanged += backgroundWorkerX_ProgressChanged;
backgroundWorkerX.WorkerReportsProgress = true;
backgroundWorkerX.RunWorkerAsync();
然后:
public void backgroundWorkerX_DoWork(object sender, DoWorkEventArgs e)
{
X = -(RSSI_PI1_ST1);
backgroundWorkerX.ReportProgress(X);
}
public void backgroundWorkerX_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
label9.Text = e.ProgressPercentage.ToString();
}
public void backgroundWorkerX_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}
[...]如果不使用循環,它將僅執行一次
這是預期的行為。 它將執行預期的操作,然后調用RunWorkerCompleted
。
[...]但如果使用無限循環,它將凍結GUI。
您不會在問題中出現循環。 因此,我將做一個假設,並給您一個有根據的猜測 ,即它實際上消耗了所有CPU,從而導致GUI崩潰。
// I assume that you loop like this somehow.
do
{
X = -(RSSI_PI1_ST1);
backgroundWorkerX.ReportProgress(X);
} while (true);
嘗試不時添加一些東西來“減慢速度” 。 否則,它將僅運行並盡可能快地運行,因此會消耗所有可用的CPU。 請記住,每次使用ReportProgress
,它將由GUI線程呈現。 這將非常頻繁地執行,並且不會為GUI線程留下很多資源來響應其他事情。 在下面,我使用Thread.Sleep
,它將暫停線程半秒鍾。 但是請記住,您只想在后台線程中執行此操作。
do
{
X = -(RSSI_PI1_ST1);
backgroundWorkerX.ReportProgress(X);
Thread.Sleep(500);
} while (true);
我也將考慮以另一種方式進行此操作。 如果確實需要暫停線程,則最好使用Timer
。 Thread.Sleep
將鎖定線程,因此可能不是您真正想要的。 從這個答案 :
Process() // method to be called after regular interval in Timer
{
// lengthy process, i.e. data fetching and processing etc.
// here comes the UI update part
Dispatcher.Invoke((Action)delegate() { /* update UI */ });
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.