美文网首页
007-BackgroundWorker组件

007-BackgroundWorker组件

作者: ottox | 来源:发表于2018-11-15 18:00 被阅读0次

功能:

提供了在后台执行耗时操作的功能,利用它既能在后台线程中与界面交互,又能有效地处理资源争用等并发冲突。

创建方式:

通过编程方式创建BackgroundWorker
从【工具箱】的“组件”选项卡中拖到窗体上。如果在Windows窗体设计BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在【属性】窗口中。

常用属性、方法和事件

CancellationPending属性:指示是否已请求取消后台操作
IsBusy属性:指示是否正在进行异步操作
WorkerReportsProgress属性:指示能否报告进度更新
WorkerSupportsCancellation属性:是否支持异步取消
CancelAsync方法:请求取消挂起的后台操作
ReportProgress方法:引发ProgressChanged事件
RunWorkerAsync方法:执行后台操作
DoWork事件:调用RunWorkerAsync时发生
ProgressChanged事件:调用ReportProgress时发生
RunWorkerCompleted事件:后台操作已完成、被取消或引发异常时发生


image.png
image.png

用法:

在DoWork事件中调用耗时的处理程序(线程处理程序)。
调用RunWorkerAsync方法启动线程(触发事件)。
在ProgressChanged事件中显示操作信息(相当于操作另一个线程的控件)
在RunWorkerCompleted事件中处理操作完成时显示的内容

示例

利用BackgroundWorker组件执行后台线程。后台线程不停地产生10000以内的随机整数,同时判断产生的这个随机数是否能被5整除,如果该数能被5整除,在主窗体的RichTextBox中显示这个数。操作界面可以启动后台线程,也可以停止后台线程。

private void buttonStart_Click(object sender, EventArgs e)
        {
            richTextBox1.Text = "开始产生10000以内的随机数……\n\n";
            buttonStart.Enabled = false;
            buttonStop.Enabled = true;
            //在后台开始操作
            backgroundWorker1.RunWorkerAsync();
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            //不要直接使用组件实例名称(backgroundWorker1),因为有多
            //个BackgroundWorker时,直接使用会产生耦合问题
            //应该通过下面的转换使用它
            BackgroundWorker worker = sender as BackgroundWorker;
            //下面的内容相当于线程要处理的内容。注意:不要在此事件中和控件打交道
            Random r = new Random();
            int numCount = 0;
            while (worker.CancellationPending == false)
            {
                int num = r.Next(10000);
                if (num % 5 == 0)
                {
                    numCount++;
                    worker.ReportProgress(0, num);
                    Thread.Sleep(1000);
                }
            }
            e.Result = numCount;
        }


        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            int num = (int)e.UserState;
            richTextBox1.Text += num + " ";
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                richTextBox1.Text += "\n\n操作停止,共产生"+e.Result+"个能被5整除的随机数";
            }
            else
            {
                richTextBox1.Text += "\n操作过程中产生错误:" + e.Error;
            }
           
        }

相关文章

网友评论

      本文标题:007-BackgroundWorker组件

      本文链接:https://www.haomeiwen.com/subject/eoxufqtx.html