zoukankan      html  css  js  c++  java
  • 【翻译】如何使用 C# 的 BackgroundWorker

    原文地址:How To Use BackgroundWorker in C#

    译文地址:如何使用 C# 的 BackgroundWorker


    简单介绍

    BackgroundWorker是一个System.ComponentModel组件库下的类,它可用于当你需要在后台做一些任务时或者不同的线程中在保持用户对UI的可用性(不冻结用户)的同时还能报告其进度。

    代码的使用

    Backgroundworker有3个事件,基本上照顾到了每一个需要做的工作。

    1. DoWork事件——实际的后台工作写在这里
    2. ProgressChanged事件——当后台工作有所进展时触发
    3. RunWorkerCompleted事件——当完成后台工作时调用

    我创建了一个WPF应用程序样例来演示如何在C#中使用BackgroundWorker

    <ProgressBar x:Name="progressbar"
     HorizontalAlignment="Left" Height="14"
     Margin="191,74,0,0" VerticalAlignment="Top"
     Width="133"/>
    <Button x:Name="button" Content="Button"
     HorizontalAlignment="Left"
     Margin="249,97,0,0" VerticalAlignment="Top"
     Width="75" Click="button_Click"/>

    在窗体的初始化函数中,我创建了一个新的BackgroundWorker对象同时注册了相应的事件。

    BackgroundWorker bg;
    public MainWindow()
    {
      InitializeComponent();
      bg = new BackgroundWorker();
      bg.DoWork += Bg_DoWork;
      bg.ProgressChanged += Bg_ProgressChanged;
      bg.RunWorkerCompleted += Bg_RunWorkerCompleted;
      bg.WorkerReportsProgress = true;
    }

    这里是以上3个事件的具体实现。

    private void Bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
      MessageBox.Show("Task completed");
    }
    
    private void Bg_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
      progressbar.Value += 1;
      //label.Content = e.ProgressPercentage;
    }
    
    private void Bg_DoWork(object sender, DoWorkEventArgs e)
    {
      for (int i = 1; i &lt;= 10; i++)
      {
        Thread.Sleep(1000); //do some task
        bg.ReportProgress(0);
      }
    }

    为了能使其正常工作,你需要想办法触发它的DoWork事件,在这里我是通过按钮点击事件来实现的。

    private void button_Click(object sender, RoutedEventArgs e)
    {
      progressbar.Value = 0;
      progressbar.Maximum = 10;
      bg.RunWorkerAsync();
    }

    这是一个非常基础的BackgroundWorker样例,但它却是一个好的开端。

    有人一定很好奇,如何它在后台工作的话是如何更新进度条的?

    其实,ProgressChanged事件是运行在UI线程中的,而DoWork是运行在应用线程池中的。这就是为什么即使运行在不同的后台线程中,它都不会冻结UI并且还能更新progressbar控件的进度条的原因了。

    如果您有任何问题或者疑虑的话,请留下您的评论。

    兴趣点

    理解如何使用BackgroundWorker是很有用的,这对你真的很有帮助——尤其是当你需要进行一些任务时,例如:并行进程,发送大量的电子邮件,保持用户对UI的可用性以及对进度的通知。

  • 相关阅读:
    第一章--购物车作业
    第一章--三级菜单作业
    第3章 文件操作-函数练习题
    面试题2.20
    Python 技巧(三)—— list 删除一个元素的三种做法
    Python 字符串操作方法大全
    员工信息增删改查程序
    Python之print函数详解
    判断登陆用户名和密码是否正确-记事本存用户名密码
    软件开发目录规范
  • 原文地址:https://www.cnblogs.com/ExDevilLee/p/5747885.html
Copyright © 2011-2022 走看看