对于.net架构下,使用c#创建的winform应用程序,在操作在长时间运行时会导致用户界面 (UI) 处于停止响应状态,用户在这操作期间无法进行其他的操作,造成非常差的用户体验,为了不使UI层处于停止响应状态,则可以使用 BackgroundWorker 类方便地解决这类问题。这个后台的线程处理,可以很好的实现常规操作的同时,还可以及时通知UI当前处理信息的进度等。
1.BackgroundWorker
BackgroundWorker是.NET Framework 里用来执行多线程任务的控件,它允许开发人员在一个单独的线程上执行一些操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。 如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。
2.BackgroundWorker的使用方法
这里对于BackgroundWorker的属性、方法等不在赘述,详情可参考C#之BackgroundWorker从简单入门到深入精通的用法总结 - Dsw - 博客园
这里只针对BackgroundWorker的运行机制呈现以下个人的理解
(1)在winform中添加BackgroundWorker组件,其有三个方法:
DoWork :执行什么操作;
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 1; i <= 100; i++)
{
if (worker.CancellationPending) // 检查是否收到取消请求
{
e.Cancel = true;
break;
}
else
{
// 执行耗时操作
var result = PerformSomeLongRunningOperation(i);
这里添加您的处理过程-----
// 如果允许报告进度,则报告当前进度
worker.ReportProgress(i, result);
// 可能需要在此处模拟延迟,例如 Thread.Sleep(100);
}
}
ProgressChanged:类似于监听每一个执行过程;
RunWorkerCompleted:执行结束的响应。
以上三个方法执行过程不详细介绍,这里需要明确的是,在处理数据处理时,将处理过程放在DoWork方法的定义中,
2.运行BackgroundWorker
backgroundWorker.RunWorkerAsync(); 通过RunWorkerAsync()方法唤醒DoWork。