C#组件之backgroundWorker

Posted 无声蝉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#组件之backgroundWorker相关的知识,希望对你有一定的参考价值。

这篇文章写得很好 C# BackgroundWorker 详解,一步一步描述很清楚

1、添加控件

backgroundWorker1           组件

label1、label2                    用于显示过程和结果信息

progressBar1                     显示后台处理进度

button1                              用于取消后台操作

2、详细代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Reflection;
using System.Threading;

namespace DemoCSDN

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
            progressBar1.Maximum = 100;
            backgroundWorker1.RunWorkerAsync(100);//调用RunWorkerAsync方法启动计算过程,其实这个方法可以接受一个 object 类型的参数。通过它我们就可以把任何数据传递给计算过程
            backgroundWorker1.WorkerReportsProgress = true;//允许我们在执行计算的过程中给UI线程发送消息
            backgroundWorker1.WorkerSupportsCancellation = true;//支持用户取消操作
        
        //执行计算的过程中给UI线程发送消息
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        
            //修改进度条的显示。
            progressBar1.Value = e.ProgressPercentage;

            //如果有更多的信息需要传递,可以使用 e.UserState 传递一个自定义的类型。
            //这是一个 object 类型的对象,您可以通过它传递任何类型。
            //我们仅把当前 sum 的值通过 e.UserState 传回,并通过显示在窗口上。
            string message = e.UserState.ToString();
            label1.Text = message;
        

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        
            BackgroundWorker bgWorker = sender as BackgroundWorker;
            int endNumber = 0;
            if (e.Argument != null)
            
                endNumber = (int)e.Argument;
            

            int sum = 0;
            for (int i = 0; i <= endNumber; i++)
            
                sum += i;

                string message = "Current sum is: " + sum.ToString();
                //ReportProgress 方法把信息传递给 ProcessChanged 事件处理函数。
                //第一个参数类型为 int,表示执行进度。
                //如果有更多的信息需要传递,可以使用 ReportProgress 的第二个参数。
                //这里我们给第二个参数传进去一条消息。
                bgWorker.ReportProgress(i, message);
                Thread.Sleep(100);
                //在操作的过程中需要检查用户是否取消了当前的操作。
                if (bgWorker.CancellationPending == true)
                
                    e.Cancel = true;
                    break;
                
            
            //如果想要拿到 e.Result,您需要在DoWork方法中设置 e.Result属性
            e.Result = sum;
        
        //如果检测到用户点击的取消按钮,就退出当前的计算过程。下面是点击取消按钮时要调用的代码:
        private void button1_Click(object sender, EventArgs e)
        
            backgroundWorker1.CancelAsync();
        
        /*如果在计算过程中发生了异常该怎么处理?有没有办法知道计算过程已经结束?当然要有,即便是正常的结束也需要拿到计算的结果。
         *通过这个事件我们可以进行一些运算结束后的操作,比如禁用取消按钮,异常处理,结果显示等。*/
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        
            //如果用户取消了当前操作就关闭窗口。
            if (e.Cancelled)
            
                this.Close();
            

            //计算已经结束,需要禁用取消按钮。
            this.button1.Enabled = false;

            //计算过程中的异常会被抓住,在这里可以进行处理。
            if (e.Error != null)
            
                Type errorType = e.Error.GetType();
                switch (errorType.Name)
                
                    case "ArgumentNullException":
                    case "MyException":
                        //do something.
                        break;
                    default:
                        //do something.
                        break;
                
            

            //计算结果信息:e.Result
            //use it do something.
            label2.Text = "完成 sum:" + e.Result.ToString();
        

    

3、界面显示

以上是关于C#组件之backgroundWorker的主要内容,如果未能解决你的问题,请参考以下文章

C# BackgroundWorker使用总结

c# BackGroundWorker 多线程操作的小例子

C#中 BackGroundWorker与Thread的区别?

C#多线程之线程池篇3

C# 多线程更新界面的第二种方法

C# BackgroundWorker 的文化