天天看點

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

   在Silverlight應用中,我們可能會遇到一些操作(如:下載下傳某個資源或某些資料庫事務或完成某些特定動作),這些操作耗時較長,容易造成“使用者界面停止響應”的現象。如果您需要能進行響應的使用者界面,而且必須執行耗時操作,則可以使用 BackgroundWorker 類友善地解決問題。 BackgroundWorker 類是.net 2.0裡新增的一個類。 使用 BackgroundWorker 類,我們可以在 Silverlight 使用者界面中訓示操作進度、完成和取消情況。例如,可以檢視背景操作是已完成還是已取消并為使用者顯示消息。

    一、BackgroundWorker類的基本了解

       涉及的命名空間

   using  System.ComponentModel;

        它的幾個屬性:

  CancellationPending——訓示應用程式是否已請求取消背景操作。 

  IsBusy——訓示 BackgroundWorker 是否正在運作異步操作 

  WorkerReportsProgress——該值訓示 BackgroundWorker 能否報告進度更新 

  WorkerSupportsCancellation——該值訓示 BackgroundWorker 是否支援異步取消 

        它的主要事件:

  DoWork——調用 RunWorkerAsync 時發生。 注意確定在 DoWork 事件處理程式中不操作任何使用者界面對象。而應該通過 ProgressChanged 和 RunWorkerCompleted 事件與使用者界面進行通信。 

  ProgressChanged——調用 ReportProgress 時發生。 

  RunWorkerCompleted——當背景操作已完成、被取消或引發異常時發生。

        它的有關方法:

  CancelAsync——請求取消挂起的背景操作 

  ReportProgress——引發 ProgressChanged 事件 

  RunWorkerAsync——開始執行背景操作 

   二、示例

    下面,我們就使用這個類來完成一個特定操作:

    用于執行從1累加到6.在累加過程中,SUM值會不斷更新,當累加到6後,BackgroundWorker會在成功執行結束後調用一段程式來輸出最終的運作資訊。

    建立一個名為:SLBackgroundWorker的Silverlight應用程式,如圖:

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

   1、建立使用者界面:

     Page.xaml代碼如下:

< UserControl x:Class = " SLBackgroundWorker.Page "

    xmlns = " http://schemas.microsoft.com/winfx/2006/xaml/presentation "  

    xmlns:x = " http://schemas.microsoft.com/winfx/2006/xaml "  

    Width = " 400 "  Height = " 350 " >

     < Grid x:Name = " LayoutRoot "  Background = " White " >

         < StackPanel Orientation = " Vertical "  Width = " 400 "  Height = " 350 "  Background = " Yellow "   >

             < TextBlock x:Name = " txtDisplay "  FontSize = " 24 "  TextAlignment = " Center "  Margin = " 10 "  Text = " 目前無内容 "  Height = " 100 "   />

             < Button x:Name = " btnRun "   Content = " 從1到6累加 "  Click = " OnRun "  Margin = " 10 "  Height = " 50 " />

             < Button x:Name = " btnCancel "  Content = " 取 消 "  Click = " OnCancel "  Margin = " 10 "  Height = " 50 " />

             < TextBlock x:Name = " txtUserState "  FontSize = " 12 "  TextAlignment = " Center "  Text = " 顯示ReportProgress方法傳回的userState值     " />

             < TextBlock x:Name = " txtEdoArgs "  FontSize = " 12 "  TextAlignment = " Center "  Text = " 顯示RunWorkerAsync()方法調用時傳入的參數 " />

         </ StackPanel >

     </ Grid >

</ UserControl >

效果如下圖

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

2、使用BackgroundWorker類

     在此我們分四個步驟來操作

     2.1、聲明一個BackgroundWorker類執行個體:若要在背景運作操作,請建立一個 BackgroundWorker。可以偵聽報告操作進度并在操作完成時發出信号的事件。

 worker  = new  System.ComponentModel.BackgroundWorker();

     2.2、相關事件的定義

     若要設定背景操作,請為 DoWork 事件添加事件處理程式,在此事件處理程式中調用耗時的操作。

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

Code

        #region 目前BackgroundWorker所執行操作

        private void OnDoWork(object sender,DoWorkEventArgs e)

        {

              //DoWorkEventArgs.Argument - RunWorkerAsync(object argument)傳遞過來的參數

              //DoWorkEventArgs.Cancel - 取消操作

              //DoWorkEventArgs.Result - 操作的結果。将傳遞到 RunWorkerCompleted 所指定的方法

              //BackgroundWorker.ReportProgress(int percentProgress, object userState) - 向 ProgressChanged 彙報操作的完成進度

              //   int percentProgress - 操作完成的百分比 1% - 100%

              //    object userState - 傳遞到 ProgressChanged 的參數

            //擷取在 worker.RunWorkerAsync()方法中傳來的參數

            //在此處,我們把它指派給了一個全局變量,并在OnProgressChanged過程中顯示出來

            eStrAll = e.Argument.ToString();

            int Value = 0;

            //如果Value還沒有加到6,并且應用程式還沒有請求取消背景操作,則繼續本循環

            while (Value <= 6 && !worker.CancellationPending)

            { 

                Thread.Sleep(1000); //挂起1秒鐘

                Value++;

                #region 調用方法一:不傳遞UserState值

                worker.ReportProgress(Value);

                #endregion

                #region 調用方法一:要傳遞UserState值

                // worker.ReportProgress(Value, "傳來的UserState值  " + Value.ToString()); //此處還可以傳遞userState(狀态對象)到RunWorkerAsync,并在OnProgressChanged中擷取

                #endregion

            }

            //如果應用程式請求取消背景操作,則取消

            if (worker.CancellationPending)

            {

                e.Cancel = true;

            }

            #region 可以在此處設定e.Result的值,并在OnWorkCompleted事件中擷取它的值

            e.Result = "操作已完成";

            #endregion

        }

        #endregion

      若要收到進度更新的通知,請處理 ProgressChanged 事件。

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

Code

        #region  異步操作進度事件

        private void OnProgressChanged(object sender, ProgressChangedEventArgs  e)

        {

            // ProgressChangedEventArgs.ProgressPercentage - ReportProgress 傳遞過來的操作完成的百分比

            // ProgressChangedEventArgs.UserState - ReportProgress 傳遞過來的參數

            txtDisplay.Text = e.ProgressPercentage.ToString(); //顯示目前進度

            #region 如果在OnDoWork中使用的是調用方法二,則在此可擷取e.UserState值

            //在此處擷取從OnDoWork中的 worker.ReportProgress方法傳回的userState值            

            //txtUserState.Text = e.UserState.ToString();

            #endregion

            #region 顯示RunWorkerAsync()方法調用時傳入的參數

            this.txtEdoArgs.Text = eStrAll;

            #endregion

        }

        #endregion

      若要在操作完成時收到通知,請處理 RunWorkerCompleted 事件。

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

Code

        #region 操作成功完成時的處理事件

        private void OnWorkCompleted(object sender,   RunWorkerCompletedEventArgs e)

        {

              //RunWorkerCompletedEventArgs.Error - DoWork 時産生的錯誤

              //RunWorkerCompletedEventArgs.Cancelled - 背景操作是否已被取消

            //RunWorkerCompletedEventArgs.Result - DoWork 的結果

            #region  進行完成時的相關判斷與處理

            if (e.Error !=null)

            {

                txtDisplay.Text = "調用失敗";

            }

            else

            {

                if(e.Cancelled)

                {

                    txtDisplay.Text = "已經取消本次操作!";

                }

                else

                {

                    txtDisplay.Text = e.Result.ToString();// 可以在此處擷取e.Result的值(它的值在OnDoWork中進行了設定)

                }

            }

            #endregion

        }

        #endregion

    若要 取消異步操作,則使用CancelAsync方法。

         #region  取消異步操作

         private   void  OnCancel( object  sender, RoutedEventArgs e)

        {

             // 取消異步操作 

            worker.CancelAsync();

        }

         #endregion

     2.3、相關事件的綁定和操作設定

             #region  步驟二:相關事件的定義、綁定和操作設定

             // 目前BackgroundWorker所執行的操作

            worker.DoWork  +=  OnDoWork;

             // 綁定異步操作進度的事件

            worker.ProgressChanged  +=  OnProgressChanged;

             // 綁定操作成功完成的處理事件

            worker.RunWorkerCompleted  +=  OnWorkCompleted;

             // 是否報告進度更新

            worker.WorkerReportsProgress  =    true ;

             // 是否支援異步取消

            worker.WorkerSupportsCancellation  =   true ;

             #endregion

  2.4、開始執行背景操作

  若要啟動背景操作,請調用 RunWorkerAsync 方法。

   #region  步驟三:開始執行背景操作

             //  IsBusy - 指定的 BackgroundWorker 是否正在背景操作

             //  RunWorkerAsync(object argument) - 開始在背景線程執行指定的操作

             //      object argument - 需要傳遞到 DoWork 的參數

             if  ( ! worker.IsBusy)

                worker.RunWorkerAsync( " 方法RunWorkerAsync調用時傳遞的參數 " );

             #endregion

Page.xaml.cs全部代碼如下:

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

using  System;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

using  System.Collections.Generic;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

using  System.Linq;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

using  System.Net;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

using  System.Windows;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

using  System.Windows.Controls;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

using  System.Windows.Documents;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

using  System.Windows.Input;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

using  System.Windows.Media;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

using  System.Windows.Media.Animation;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

using  System.Windows.Shapes;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

using  System.ComponentModel; // 必須要引入此命名空間才能使用BackgroundWorker類

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

using  System.Threading;  // 必須要引入此命名空間才能執行 Sleep(1000)挂起1秒鐘操作

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

namespace  SLBackgroundWorker

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

{

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

    public partial class Page : UserControl

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

{

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        private  BackgroundWorker worker;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        string eStrAll = "";  //用于儲存調用RunWorkerAsync()方法時的傳參,此傳參在OnDoWork()方法中截取到

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        public Page()

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

{

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            InitializeComponent();

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        }

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        private void OnRun(object sender, RoutedEventArgs e)

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

{

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            步驟一:聲明一個BackgroundWorker類執行個體#region 步驟一:聲明一個BackgroundWorker類執行個體

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            worker =new System.ComponentModel.BackgroundWorker();

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            #endregion

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            步驟二:相關事件的定義、綁定和操作設定#region 步驟二:相關事件的定義、綁定和操作設定

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            //目前BackgroundWorker所執行的操作

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            worker.DoWork += OnDoWork;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            //綁定異步操作進度的事件

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            worker.ProgressChanged += OnProgressChanged;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            //綁定操作成功完成的處理事件

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            worker.RunWorkerCompleted += OnWorkCompleted;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            //是否報告進度更新

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            worker.WorkerReportsProgress =  true;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            //是否支援異步取消

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            worker.WorkerSupportsCancellation = true;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            #endregion

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            步驟三:開始執行背景操作#region 步驟三:開始執行背景操作

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            // IsBusy - 指定的 BackgroundWorker 是否正在背景操作

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            // RunWorkerAsync(object argument) - 開始在背景線程執行指定的操作

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            //     object argument - 需要傳遞到 DoWork 的參數

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            if (!worker.IsBusy)

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

                worker.RunWorkerAsync("方法RunWorkerAsync調用時傳遞的參數");

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            #endregion

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        }

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        目前BackgroundWorker所執行操作#region 目前BackgroundWorker所執行操作

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        private void OnDoWork(object sender,DoWorkEventArgs e)

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

{

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

              //DoWorkEventArgs.Argument - RunWorkerAsync(object argument)傳遞過來的參數

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

              //DoWorkEventArgs.Cancel - 取消操作

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

              //DoWorkEventArgs.Result - 操作的結果。将傳遞到 RunWorkerCompleted 所指定的方法

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

              //BackgroundWorker.ReportProgress(int percentProgress, object userState) - 向 ProgressChanged 彙報操作的完成進度

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

              //   int percentProgress - 操作完成的百分比 1% - 100%

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

              //    object userState - 傳遞到 ProgressChanged 的參數

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            //擷取在 worker.RunWorkerAsync()方法中傳來的參數

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            //在此處,我們把它指派給了一個全局變量,并在OnProgressChanged過程中顯示出來

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            eStrAll = e.Argument.ToString();

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            int Value = 0;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            //如果Value還沒有加到6,并且應用程式還沒有請求取消背景操作,則繼續本循環

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            while (Value <= 6 && !worker.CancellationPending)

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

                Thread.Sleep(1000); //挂起1秒鐘

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

                Value++;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

                調用方法一:不傳遞UserState值#region 調用方法一:不傳遞UserState值

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

                worker.ReportProgress(Value);

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

                #endregion

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

                調用方法一:要傳遞UserState值#region 調用方法一:要傳遞UserState值

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

                // worker.ReportProgress(Value, "傳來的UserState值  " + Value.ToString()); //此處還可以傳遞userState(狀态對象)到RunWorkerAsync,并在OnProgressChanged中擷取

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

                #endregion

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            }

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            //如果應用程式請求取消背景操作,則取消

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            if (worker.CancellationPending)

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

{

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

                e.Cancel = true;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            }

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            可以在此處設定e.Result的值,并在OnWorkCompleted事件中擷取它的值#region 可以在此處設定e.Result的值,并在OnWorkCompleted事件中擷取它的值

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            e.Result = "操作已完成";

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            #endregion

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        }

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        #endregion

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        異步操作進度事件#region  異步操作進度事件

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        private void OnProgressChanged(object sender, ProgressChangedEventArgs  e)

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

{

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            // ProgressChangedEventArgs.ProgressPercentage - ReportProgress 傳遞過來的操作完成的百分比

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            // ProgressChangedEventArgs.UserState - ReportProgress 傳遞過來的參數

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            txtDisplay.Text = e.ProgressPercentage.ToString(); //顯示目前進度

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            如果在OnDoWork中使用的是調用方法二,則在此可擷取e.UserState值#region 如果在OnDoWork中使用的是調用方法二,則在此可擷取e.UserState值

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            //在此處擷取從OnDoWork中的 worker.ReportProgress方法傳回的userState值            

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            //txtUserState.Text = e.UserState.ToString();

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            #endregion

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            顯示RunWorkerAsync()方法調用時傳入的參數#region 顯示RunWorkerAsync()方法調用時傳入的參數

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            this.txtEdoArgs.Text = eStrAll;

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            #endregion

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        }

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        #endregion

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        操作成功完成時的處理事件#region 操作成功完成時的處理事件

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        private void OnWorkCompleted(object sender,   RunWorkerCompletedEventArgs e)

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

{

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

              //RunWorkerCompletedEventArgs.Error - DoWork 時産生的錯誤

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

              //RunWorkerCompletedEventArgs.Cancelled - 背景操作是否已被取消

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            //RunWorkerCompletedEventArgs.Result - DoWork 的結果

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            進行完成時的相關判斷與處理#region  進行完成時的相關判斷與處理

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            if (e.Error !=null)

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

{

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

                txtDisplay.Text = "調用失敗";

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            }

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            else

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

{

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

                if(e.Cancelled)

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

{

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

                    txtDisplay.Text = "已經取消本次操作!";

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

                }

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

                else

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

{

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

                    txtDisplay.Text = e.Result.ToString();// 可以在此處擷取e.Result的值(它的值在OnDoWork中進行了設定)

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

                }

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            }

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            #endregion

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        }

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        #endregion

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        取消異步操作#region 取消異步操作

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        private void OnCancel(object sender, RoutedEventArgs e)

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用
SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

{

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            //取消異步操作 

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

            worker.CancelAsync();

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        }

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

        #endregion

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

    }

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

}

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

運作效果如下:

SilverLight學習筆記--Silverligh之BackgroundWorker類的應用

說明:

 1、您必須非常小心,確定在 DoWork 事件處理程式中不操作任何使用者界面對象。而應該通過 ProgressChanged 和 RunWorkerCompleted 事件與使用者界面進行通信。

 2、如果背景操作需要參數,請在調用 RunWorkerAsync 時給出參數。在 DoWork 事件處理程式内部,可以從DoWorkEventArgs提取該參數。

前往:Silverlight學習筆記清單

本文程式在Silverlight2.0和VS2008環境中調試通過。本文參照了部分網絡資料,希望能夠抛磚引玉,大家共同學習。

(轉載本文請注明出處)