BackgroundWorker控件使用记录

发布时间 2023-11-02 16:52:08作者: 时而有风

C#之BackgroundWorker从简单入门到深入精通的用法总结

  有些操作在长时间运行时会导致用户界面 (UI) 处于停止响应状态,用户在这操作期间无法进行其他的操作,造成非常差的用户体验,为了不使UI层处于停止响应状态,则可以使用 BackgroundWorker 类方便地解决这类问题。这个后台的线程处理,可以很好的实现常规操作的同时,还可以及时通知UI当前处理信息的进度等。

  可以通过在winform的工具箱中拖入BackgroundWorker,也可以采用编程的方式,本文采用前者方式。

  若要为后台操作做好准备,请添加 DoWork 事件的事件处理程序。 在此事件处理程序中调用耗时的操作。 若要开始此操作,请调用 RunWorkerAsync; 若要收到进度更新的通知,请处理 ProgressChanged 事件,并通过调用ReportProgress方法来引发ProgressChanged 事件; 若要在操作完成时收到通知,请处理 RunWorkerCompleted 事件。

  需要注意:由于DoWork事件内部的代码运行在非UI线程之上,确保在 DoWork 事件处理程序中不操作任何用户界面对象。 而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。

  

using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;

namespace TestWinform
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            backgroundWorker1.WorkerReportsProgress      = true; //指示BackgroundWorker是否报告进度更新
            backgroundWorker1.WorkerSupportsCancellation = true; //是否支持去取消
        }

        /// <summary>
        /// 开始按钮
        /// </summary>
        /// <param name = "sender"> </param>
        /// <param name = "e"> </param>
        private void button1_Click(object sender, EventArgs e)
        {
            if (!backgroundWorker1.IsBusy)
            {
                backgroundWorker1.RunWorkerAsync(); //开始执行后台操作
            }
        }

        /// <summary>
        /// 停止按钮
        /// </summary>
        /// <param name = "sender"> </param>
        /// <param name = "e"> </param>
        private void button2_Click(object sender, EventArgs e)
        {
            backgroundWorker1.CancelAsync(); //请求取消后台操作
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            for (var i = 0; i <= 100; i++)
            {
                if (backgroundWorker1.CancellationPending) //是否已请求后台取消操作
                {
                    e.Cancel = true;
                    break;
                }

                backgroundWorker1.ReportProgress(i); //引发 ProgressChanged 事件。
                Thread.Sleep(100);
            }
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage; //获取异步任务的进度百分比
            label1.Text        = @"已完成:" + e.ProgressPercentage + @"%";
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            label1.Text = "后台操作结束";
        }
    }
}