C#后台工作者冻结了GUI

时间:2016-10-05 04:48:39

标签: c# background worker

我正在尝试使用后台工作程序不断更新文本标签,但对于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)
{

}

1 个答案:

答案 0 :(得分:2)

  

[...]如果没有使用循环,它只会执行一次

这是预期的行为。它将完成它预期的事情然后调用RunWorkerCompleted

  

[...]但如果使用无限循环,它会冻结GUI。

您的问题中没有出现循环。所以我会做出一个假设,并会给你一个受过教育的猜测,它实际上消耗了所有的CPU,因此崩溃了GUI。

LOAD DATA LOCAL INPATH '/data/file1' INTO TABLE table1;

尝试偶尔向“慢下来”添加内容。否则它将尽可能快地运行和运行,因此消耗所有可用的CPU。请记住,每次使用// I assume that you loop like this somehow. do { X = -(RSSI_PI1_ST1); backgroundWorkerX.ReportProgress(X); } while (true); 时,它都将由GUI线程呈现。这将经常执行 并且不会为GUI线程留下大量资源来响应其他事情。下面我使用Thread.Sleep,它会暂停线程半秒钟。但请记住,您只想在后台线程中执行此操作。

ReportProgress

我也会考虑采取另一种方式。如果您确实需要暂停线程,那么您可以使用Timer来执行此操作。 do { X = -(RSSI_PI1_ST1); backgroundWorkerX.ReportProgress(X); Thread.Sleep(500); } while (true); 将锁定线程,因此可能不是您真正想要的。来自this answer

Thread.Sleep