BackgroundWorker类允许您在单独的专用线程上运行操作。 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker类方便地解决问题(MSDN)。
public partial class Form1 : Form
{
BackgroundWorker bgw = new BackgroundWorker();
public Form1()
{
InitializeComponent();
bgw.WorkerReportsProgress = true;
bgw.WorkerSupportsCancellation = true;
bgw.DoWork+=new DoWorkEventHandler(bgw_DoWork);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
}
private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
lbResult.Text = (e.ProgressPercentage.ToString() + "%" + e.UserState);
}
private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
lbResult.Text = "Canceled!";
}
else if (e.Error != null)
{
lbResult.Text = "Error: " + e.Error.Message;
}
else
{
lbResult.Text = "Done!";
}
}
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i <= 12; i++)
{
if (bgw.CancellationPending == true)
{
e.Cancel = true;
break;
}
else
{
System.Threading.Thread.Sleep(500);
bgw.ReportProgress(i * 10);
}
}
}
private void btnStart_Click(object sender, EventArgs e)
{
if (bgw.IsBusy != true)
{
bgw.RunWorkerAsync();
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
if (bgw.WorkerSupportsCancellation == true)
{
bgw.CancelAsync();
}
}