zoukankan      html  css  js  c++  java
  • 如何:使用后台辅助线程

    http://msdn.microsoft.com/zh-cn/library/cc221403(v=vs.95).aspx

    如何:使用后台辅助线程

    Silverlight
                1(共 1)对本文的评价是有帮助 - 评价此主题

    Silverlight BackgroundWorker 类提供通过后台线程运行非常耗时的操作的便利方法。BackgroundWorker 类允许您查看操作的状态并且可以取消操作。

    使用 BackgroundWorker 类时,可以在 Silverlight 用户界面中指示操作进度、完成和取消情况。例如,可以查看后台操作是已完成还是已取消并为用户显示消息。

    使用 BackgroundWorker 类

    1. 在类级别创建 BackgroundWorker 类的实例。

      BackgroundWorker bw = new BackgroundWorker();
      
    2. 指定是否希望后台操作允许执行取消操作和报告进度。

      bw.WorkerSupportsCancellation = true;
      bw.WorkerReportsProgress = true;
      
    3. 为后台辅助线程的 DoWork 事件创建事件处理程序。

      DoWork 事件处理程序位于在后台线程运行非常耗时的操作的位置。应在 DoWorkEventArgs 对象的 Argument 属性中传递要传递给后台操作的任何值,而该属性将传递给事件处理程序。

      若要将进度报告回调用进程,请调用 ReportProgress 方法并将介于 0 到 100 之间的完成百分比传递给它。调用 ReportProgress 方法将引发 ProgressChanged 事件,您将单独处理该事件。

      注意说明:

      如果后台辅助线程的 WorkerReportsProgress 属性未设置为 true 且调用了 ReportProgress 方法,将引发异常。

      若要确定是否有取消后台操作的挂起的请求,请查看 BackgroundWorker 对象的 CancellationPending 属性。如果该属性为 true,则表示调用了 CancelAsync 方法。BackgroundWorker 对象的 Cancel 属性设置为 true 并停止操作。

      若要将数据传递回调用进程,请设置要传递给事件处理程序的 DoWorkEventArgs 对象的 Result 属性。在操作结束引发 RunWorkerCompleted 事件时,可以读取此值。

      private void bw_DoWork(object sender, DoWorkEventArgs e)
      {
          BackgroundWorker worker = sender as BackgroundWorker;
      
          for (int i = 1; (i <= 10); i++)
          {
              if ((worker.CancellationPending == true))
              {
                  e.Cancel = true;
                  break;
              }
              else
              {
                  // Perform a time consuming operation and report progress.
                  System.Threading.Thread.Sleep(500);
                  worker.ReportProgress((i * 10));
              }
          }
      }
      
      
      
    4. 为后台辅助线程的 ProgressChanged 事件创建事件处理程序。

      ProgressChanged 事件处理程序中,添加指示进度的代码(如更新用户界面)。

      若要确定操作的完成百分比,请查看传递给事件处理程序的 ProgressChangedEventArgs 对象的 ProgressPercentage 属性。

      private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
      {
          this.tbProgress.Text = (e.ProgressPercentage.ToString() + "%");
      }
      
      
      
    5. RunWorkerCompleted 事件创建一个事件处理程序。

      后台辅助线程完成时,将引发 RunWorkerCompleted 事件。根据后台操作是成功完成、遇到错误还是已取消,相应更新用户界面。

      若要确定是否出错,请查看传递给事件处理程序的 RunWorkerCompletedEventArgs 对象的 Error 属性。如果出错,此属性将包含异常信息。

      如果后台操作允许取消且您想查看操作是否被取消,请查看传递给事件处理程序的 RunWorkerCompletedEventArgs 对象的 Cancelled 属性。如果该属性为 true,则表示调用了 CancelAsync 方法。

      private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
      {
          if ((e.Cancelled == true))
          {
              this.tbProgress.Text = "Canceled!";
          }
      
          else if (!(e.Error == null))
          {
              this.tbProgress.Text = ("Error: " + e.Error.Message);
          }
      
          else
          {
              this.tbProgress.Text = "Done!";
          }
      }
      
      
      
    6. BackgroundWorker 实例的事件添加事件处理程序。

      下面的示例演示如何为 DoWorkProgressChangedRunWorkerCompleted 事件添加事件处理程序。

      bw.DoWork += 
          new DoWorkEventHandler(bw_DoWork);
      bw.ProgressChanged += 
          new ProgressChangedEventHandler(bw_ProgressChanged);
      bw.RunWorkerCompleted += 
          new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
      
    7. 通过调用 RunWorkerAsync 方法来开始运行后台操作。

      private void buttonStart_Click(object sender, RoutedEventArgs e)
      {
          if (bw.IsBusy != true)
          {
              bw.RunWorkerAsync();
          }
      }
      
      
      
    8. 通过调用 CancelAsync 方法来取消后台操作。

      private void buttonCancel_Click(object sender, RoutedEventArgs e)
      {
          if (bw.WorkerSupportsCancellation == true)
          {
              bw.CancelAsync();
          }
      }
      
      
      

    下面的示例演示如何使用 BackgroundWorker 类。在此示例中,后台操作运行 Sleep 方法并将进度报告给用户界面。后台辅助线程已配置为允许取消。

    using System.ComponentModel;
    using System.Windows;
    using System.Windows.Controls;
    
    namespace SL_BackgroundWorker_CS
    {
        public partial class Page : UserControl
        {
            private BackgroundWorker bw = new BackgroundWorker();
    
            public Page()
            {
                InitializeComponent();
    
                bw.WorkerReportsProgress = true;
                bw.WorkerSupportsCancellation = true;
                bw.DoWork += new DoWorkEventHandler(bw_DoWork);
                bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
                bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
            }
            private void buttonStart_Click(object sender, RoutedEventArgs e)
            {
                if (bw.IsBusy != true)
                {
                    bw.RunWorkerAsync();
                }
            }
            private void buttonCancel_Click(object sender, RoutedEventArgs e)
            {
                if (bw.WorkerSupportsCancellation == true)
                {
                    bw.CancelAsync();
                }
            }
            private void bw_DoWork(object sender, DoWorkEventArgs e)
            {
                BackgroundWorker worker = sender as BackgroundWorker;
    
                for (int i = 1; (i <= 10); i++)
                {
                    if ((worker.CancellationPending == true))
                    {
                        e.Cancel = true;
                        break;
                    }
                    else
                    {
                        // Perform a time consuming operation and report progress.
                        System.Threading.Thread.Sleep(500);
                        worker.ReportProgress((i * 10));
                    }
                }
            }
            private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                if ((e.Cancelled == true))
                {
                    this.tbProgress.Text = "Canceled!";
                }
    
                else if (!(e.Error == null))
                {
                    this.tbProgress.Text = ("Error: " + e.Error.Message);
                }
    
                else
                {
                    this.tbProgress.Text = "Done!";
                }
            }
            private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                this.tbProgress.Text = (e.ProgressPercentage.ToString() + "%");
            }
        }
    }
    
    
    
    <UserControl x:Class="SL_BackgroundWorker_CS.Page"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        Width="400" Height="300">
        <Grid x:Name="LayoutRoot" Background="White">
            <StackPanel Height="30" Orientation="Horizontal" 
                        HorizontalAlignment="Left" VerticalAlignment="Top" 
                        Margin="10" >
                <Button x:Name="buttonStart" Content="Start" Click="buttonStart_Click"
                        Width="80" Height="30"/>
                <Button x:Name="buttonCancel" Content="Cancel" Click="buttonCancel_Click"
                        Width="80" Height="30"/>
            </StackPanel>
            <StackPanel Margin="10,50,0,0" Orientation="Horizontal">
                <TextBlock Text="Progress: "/>
                <TextBlock x:Name="tbProgress"/>
            </StackPanel>
        </Grid>
    </UserControl>
    
    
    
    <UserControl x:Class="SL_BackgroundWorker_VB.Page"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        Width="400" Height="300">
        <Grid x:Name="LayoutRoot" Background="White">
            <StackPanel Height="30" Orientation="Horizontal" 
                        HorizontalAlignment="Left" VerticalAlignment="Top" 
                        Margin="10" >
                <Button x:Name="buttonStart" Content="Start" Click="buttonStart_Click"
                        Width="80" Height="30"/>
                <Button x:Name="buttonCancel" Content="Cancel" Click="buttonCancel_Click"
                        Width="80" Height="30"/>
            </StackPanel>
            <StackPanel Margin="10,50,0,0" Orientation="Horizontal">
                <TextBlock Text="Progress: " />
                <TextBlock x:Name="tbProgress" />
            </StackPanel>
        </Grid>
    </UserControl>
    
    
    
    本文是否对您有所帮助?           
    (1500 个剩余字符)
    社区内容添加
    <div><img alt="DCSIMG" id="Img1" width="1" height="1" src="http://m.webtrends.com/dcsmgru7m99k7mqmgrhudo0k8_8c6m/njs.gif?dcsuri=/nojavascript&WT.js=No" /></div>
    <a href="http://www.omniture.com" title="Web Analytics"> <img src="//msstonojsmsdn.112.2o7.net/b/ss/msstonojsmsdn/1/H.20.2--NS/0" height="1" width="1" border="0" alt="" /></a>
  • 相关阅读:
    Linux文件属性
    [Oracle] Listener的动态注册
    jQuery easyUI Pagination控件自定义div分页(不用datagrid)
    桂林电子科技大学出校流量控制器Android版1.0.0
    php使用check box
    Python windows ping
    Python selenium chrome 环境配置
    Linux wget auto login and backup database
    PyQt4 ShowHMDB show sqlite3 with QTableWidget summary
    PyQt4 py2exe 打包 HardwareManager
  • 原文地址:https://www.cnblogs.com/gitran/p/3644135.html
Copyright © 2011-2022 走看看