• 如何:使用后台辅助线程


    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>
  • 相关阅读:
    Java.Annotations
    Tools.Eclipse.HowToImportAnAndroidLibraryProjectIntoWorkspace
    Android.Tools.Eclipse hangs at the Android SDK Content Loader
    .Net之用户控件笔记
    sql语句之静态行转列(转)
    sql语句之查看数据库及数据表创建日期
    sql语句之UNION,联合查询
    Pyhton不能输入中文注释
    js获取referrer中的参数
    angularJS插入html及更换iframe的src
  • 原文地址:https://www.cnblogs.com/gitran/p/3644135.html
Copyright © 2020-2023  润新知