C# BackgroundWorker组件学习

      

 

     C# BackgroundWorker组件学习html

 

       一个程序中须要进行大量的运算,而且须要在运算过程当中支持用户必定的交互,为了得到更好的用户体验,使用BackgroundWorker来完成这一功能.     数据库

 

        BackgroundWorker类容许您在单独的专用线程上运行操做。  耗时的操做(以下载和数据库事务)在长时间运行时可能会致使用户界面 (UI) 彷佛处于中止响应状态。编程

  若是您须要能进行响应的用户界面,并且面临与这类操做相关的长时间延迟,则可使用 BackgroundWorker类方便地解决问题(MSDN)。 app

 

        若要在后台执行耗时的操做,请建立一个 BackgroundWorker,侦听那些报告操做进度并在操做完成时发出信号的事件。  能够经过编程方式建立 BackgroundWorker异步

  也能够将它从“工具箱”“组件”选项卡中拖到窗体上。  若是在 Windows 窗体设计器中建立 BackgroundWorker,则它会出如今组件栏中,并且它的属性会显示在“属性”窗async

  口中(MSDN)。ide

 

  属性:工具

 

   IsBusy:获取一个值,指示 BackgroundWorker 是否正在运行异步操做。学习

   WorkerReportsProgress: 获取或设置一个值,该值指示 BackgroundWorker 可否报告进度更新。ui

   WorkerSupportsCancellation: 获取或设置一个值,该值指示 BackgroundWorker 是否支持异步取消。

 

   事件:

 

   DoWork: 调用 RunWorkerAsync 时发生。

   ProgressChanged: 调用 ReportProgress 时发生。

   RunWorkerCompleted: 当后台操做已完成、被取消或引起异常时发生。

 

   实例:

 

   窗体设计以下图:

 

 

 

   代码实现:

  

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;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            backgroundWorker1.WorkerReportsProgress = true;
            backgroundWorker1.WorkerSupportsCancellation = true;
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            for (int i = 1; i <= 12; i++)
            {
                if (worker.CancellationPending == true)
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    System.Threading.Thread.Sleep(500);
                    worker.ReportProgress(i * 10);
                }
            }
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            lbResult.Text = (e.ProgressPercentage.ToString() + "%"+e.UserState);
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {
                lbResult.Text = "Canceled!";
            }
            else if (e.Error != null)
            {
                lbResult.Text = "Error: " + e.Error.Message;
            }
            else
            {
                lbResult.Text = "Done!";
            }
        }

        private void btnStartAsync_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy != true)
            {
                backgroundWorker1.RunWorkerAsync();
            }
        }

        private void btnCancelAsync_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.WorkerSupportsCancellation == true)
            {
                backgroundWorker1.CancelAsync();
            }
        }
    }
}

 

 

 

   运行结果:

 

 

相关文章
相关标签/搜索