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、界面显示

猜你喜欢

转载自blog.csdn.net/zhuxipan1990/article/details/83116540