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