聲明成員變量
/// <summary>
/// BackgroundWorker對象
/// </summary>
BackgroundWorker myBackgroundWorker;
初始化BackgroundWorder
/// <summary>
/// 初始化BackgroundWorker對象
/// </summary>
private void InitBackgroundWorker()
{
myBackgroundWorker = new BackgroundWorker(){ WorkerReportsProgress = true, WorkerSupportsCancellation = true };
myBackgroundWorker.DoWork += myBackgroundWorker_DoWork;
myBackgroundWorker.ProgressChanged += myBackgroundWorker_ProgressChanged;
myBackgroundWorker.RunWorkerCompleted += myBackgroundWorker_RunWorkerCompleted;
}
開始工作事件
/// <summary>
/// 開始工作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void myBackgroundWorker_DoWork(object sender,DoWorkEventArgs e)
{
//接收參數
object obj = e.Argument;
//停止功能(可以在循環中多放置一些,讓程式更快的響應停止功能)
if(((BackgroundWorker)sender).CancellationPending)
{
e.Cancel = true;
return;
}
//做一些事情
//do something...
//更新進度
//((BackgroundWorker)sender).ReportProgress((目前數/總數[需要時Int]),string.Format("可以給提示文字:{0}",(目前數/總數));
}
進度更新
/// <summary>
/// 更新進度事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void myBackgroundWorker_ProgressChanged(object sender,ProgressChangedEventArgs e)
{
//進度提示文字
XXX.Text = e.UserState.ToString();
//進度條
XXX.Value = e.ProgressPercentage;
}
運作完成
/// <summary>
/// 工作完成事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void myBackgroundWorker_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
{
//更新界面提示
XXX.Text = "已完成XXX";
//進度條
XXX.Value = 這裡給進度條最大值;
//判斷是否被取消
if (e.Cancelled)
{
// ...
}
else
{
// ...
}
//釋放資源
((BackgroundWorker)sender).Dispose();
}
建立一個新的Worker,這個方法在要中斷之前的Worker并且繼續進行查詢時使用
/// <summary>
/// 開啟新的Worker
/// </summary>
/// <param name="sourceArgument">運作參數</param>
private void openNewWorker(object sourceArgument)
{
//判斷是否為空
if(myBackgroundWorker != null)
{
//判斷是否處于忙碌中
if(myBackgroundWorker.IsBusy)
{
//發出停止指令
myBackgroundWorker.CancelAsync();
}
}
//執行個體化一個新的Worker
myBackgroundWorker = new BackgroundWorker(){ WorkerReportsProgress = true, WorkerSupportsCancellation = true };
myBackgroundWorker.DoWork += myBackgroundWorker_DoWork;
myBackgroundWorker.ProgressChanged += myBackgroundWorker_ProgressChanged;
myBackgroundWorker.RunWorkerCompleted += myBackgroundWorker_RunWorkerCompleted;
//運作這個Worker
myBackgroundWorker.RunWorkerAsync(sourceArgument);
}
這是本人在使用中積攢下來的一點經驗,歡迎大家提出意見,我們一起讨論。