在 BackgroundWorker 的后台线程中,每秒向UI界面汇报1次状态:
后台线程
后台线程中要执行的代码都是耗时的,要适时将运行状态报告到UI界面上提供给用户。如果每运行一遍就汇报一次则显得太过频繁,影响了效率。选择每秒汇报一次则比较合适。
private void backgroundWork1_DoWork(object sender, DoWorkEventArgs e)
{
var worker = sender as BackgroundWorker;
var watch = new StopWatch();
watch.Start();
var start = watch.ElapsedMillisecond;
while(true)
{
// TODO: 耗时的操作在这里
// 1秒汇报一次
var timeSpan = watch.ElapsedMilliseconds - start;
if(timeSpan > 1000) // 1秒
{ worker.ReportProgress(0,"Hello.");
start = watch.ElapsedMilliseconds;
}
// 判断退出条件
// 放在while循环的末尾判断退出条件,是为了让退出前的最后一次运行状态也能汇报出去。
Thread.Sleep(1);
if(worker.CancellationPending)
{
worker.ReportProgress(0,"lastState");
e.Cancel = true;
return;
}
}
}
界面线程
界面线程,显示或接收软件产生的数据:
private void backgroundWork1_ProgressChanged(Object sender, ProgressChangedEventArgs e)
{
richTextBox1.AppendText(string.Format("{0}\n",e.UserState));
}