天天看點

WPF中使用BackgroundWorder

聲明成員變量

/// <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);
}
           

這是本人在使用中積攢下來的一點經驗,歡迎大家提出意見,我們一起讨論。

繼續閱讀