簡體   English   中英

C#背景工作者凍結了GUI

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM