欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# BackgroundWorker组件学习入门介绍

程序员文章站 2024-02-20 15:57:58
一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用backgroundworker来完成这一功能.  &...

一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用backgroundworker来完成这一功能.    

 backgroundworker类允许您在单独的专用线程上运行操作。  耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (ui) 似乎处于停止响应状态。

  如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 backgroundworker类方便地解决问题(msdn)。

        若要在后台执行耗时的操作,请创建一个 backgroundworker,侦听那些报告操作进度并在操作完成时发出信号的事件。  可以通过编程方式创建 backgroundworker,

  也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。  如果在 windows 窗体设计器中创建 backgroundworker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中(msdn)。

属性:

   isbusy:获取一个值,指示 backgroundworker 是否正在运行异步操作。
   workerreportsprogress:获取或设置一个值,该值指示 backgroundworker 能否报告进度更新。
   workersupportscancellation:获取或设置一个值,该值指示 backgroundworker 是否支持异步取消。

事件:

dowork:调用 runworkerasync 时发生。
progresschanged:调用 reportprogress 时发生。
runworkercompleted:当后台操作已完成、被取消或引发异常时发生。

实例:

 窗体设计如下图:

C# BackgroundWorker组件学习入门介绍

代码实现:

复制代码 代码如下:

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();
            }
        }
    }
}

运行结果:

C# BackgroundWorker组件学习入门介绍

C# BackgroundWorker组件学习入门介绍

C# BackgroundWorker组件学习入门介绍