BackgroundWorker

 

今天我们来看看BackgroundWorker这个类

 

BackgroundWorker 类允许您在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。

 

注意:您必须非常小心,确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。

 

这里,我们使用WPF为例

 

XAML:

    <StackPanel>
        <ProgressBar Margin="5" x:Name="progressBar_Info" Height="20"/>
        <Button Margin="5" x:Name="myButton" Content="Start" Height="20" Click="Button_Click" />
    </StackPanel>

 

C# Code:

  private BackgroundWorker backgroundWork1 = new BackgroundWorker() { WorkerReportsProgress=true }; public MainWindow() { InitializeComponent(); #region DoWork backgroundWork1.DoWork += new DoWorkEventHandler( (s, e) => { for (int i = 1; i <= 100; i++) { backgroundWork1.ReportProgress(i); System.Threading.Thread.Sleep(100); } }); #endregion

            #region ProgressChanged backgroundWork1.ProgressChanged += new ProgressChangedEventHandler( (s, e) => { progressBar_Info.Value = e.ProgressPercentage; myButton.Content = string.Format("当前进度{0}/100",e.ProgressPercentage); }); #endregion

            #region RunWorkerCompleted backgroundWork1.RunWorkerCompleted += new RunWorkerCompletedEventHandler( (s, e) => { this.Title = string.Format("结束时间:{0}", DateTime.Now.ToLongTimeString()); myButton.Content = "Start"; }); #endregion } private void Button_Click(object sender, RoutedEventArgs e) { if (backgroundWork1.IsBusy) //IsBusy表示是否正在进行异步操作
 { this.Title = "正在执行中,请等待......"; } else { this.Title = string.Format("开始执行时间:{0}", DateTime.Now.ToLongTimeString()); backgroundWork1.RunWorkerAsync();//开始执行后台操作
                this.Title += string.Format("___Click事件结束时间:{0}", DateTime.Now.ToLongTimeString()); } }

 

 

 

微软在NET Framework 2.0 就已经提供了BackgroundWorker ,  使用BackgroundWorker 的 ProgressChanged 和 RunWorkerCompleted 事件可直接反应当前进度与执行状况,避免了我们使用传统的Invoke自己去计算当前执行进度与状态......

 

参考自MSDN:http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker(v=vs.80)

 

你可能感兴趣的:(background)