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 事件添加事件处理程序,在此事件处理程序中调用耗时的操作。

 

Code

       
      若要收到进度更新的通知,请处理 ProgressChanged 事件。
 

Code

      若要在操作完成时收到通知,请处理 RunWorkerCompleted 事件。
   

Code


    若要 取消异步操作,则使用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全部代码如下:

using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;
using  System.ComponentModel; // 必须要引入此命名空间才能使用BackgroundWorker类
using  System.Threading;  // 必须要引入此命名空间才能执行 Sleep(1000)挂起1秒钟操作

namespace  SLBackgroundWorker
{
    
public partial class Page : UserControl
    
{

        
private  BackgroundWorker worker;
        
string eStrAll = "";  //用于保存调用RunWorkerAsync()方法时的传参,此传参在OnDoWork()方法中截取到

        
public Page()
        
{
            InitializeComponent();
        }


        
private void OnRun(object sender, RoutedEventArgs e)
        
{
            
步骤一:声明一个BackgroundWorker类实例

            
步骤二:相关事件的定义、绑定和操作设置

            
步骤三:开始执行后台操作

        }



        
当前BackgroundWorker所执行操作

        
异步操作进度事件

        
操作成功完成时的处理事件

        
取消异步操作
    }

}

运行效果如下:
SilverLight学习笔记--Silverligh之BackgroundWorker类的应用
 

说明:
 1、您必须非常小心,确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
 2、如果后台操作需要参数,请在调用 RunWorkerAsync 时给出参数。在 DoWork 事件处理程序内部,可以从DoWorkEventArgs提取该参数。


前往:Silverlight学习笔记清单


本文程序在Silverlight2.0和VS2008环境中调试通过。本文参照了部分网络资料,希望能够抛砖引玉,大家共同学习。
(转载本文请注明出处)

你可能感兴趣的:(silverlight)