前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#中backgroundworker的使用

C#中backgroundworker的使用

作者头像
MaybeHC
发布2024-04-23 19:19:40
650
发布2024-04-23 19:19:40
举报
文章被收录于专栏:技术之路技术之路

通过一个demo来说一下backgroundworker的使用

在这里插入图片描述
在这里插入图片描述

上图使我们最终需要实现的效果,下来我们开始编码

声明backgroundworker并绑定事件

在注释中已经写出属性的含义和绑定事件的含义。

代码语言:javascript
复制
BackgroundWorker backgroundWorker1;
backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
backgroundWorker1.WorkerReportsProgress = true;//能否报告进度更新
backgroundWorker1.WorkerSupportsCancellation = true;//能否支持异步取消
//绑定执行事件
backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
//绑定消息传递事件
backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged);
//绑定执行事件完成事件
backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);

DoWork

后台要执行的任务

代码语言:javascript
复制
 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker bw = sender as BackgroundWorker;
            for (int i = 0;  i <= 100; i++)
            {
                if (bw.CancellationPending)//用户取消了操作CancellationPending会为true
                {
                    //该结果会被传送到RunWorkerCompleted事件中
                    e.Cancel = true;
                    return;
                }
                //报告进度(同时触发ProgressChanged事件)
                bw.ReportProgress(i,$"已经完成{i}%");
                Thread.Sleep(Convert.ToInt32(e.Argument));
            }
            e.Result = "完成";
        }

CancellationPending 是用户取消的标志,当用户调用CancelAsync()方法时CancellationPending 会为true。 e.Cancel = true;将结果会被传送到RunWorkerCompleted事件中(任务完成事件)

ProgressChanged

更新工作进展情况,在执行的任务重调用bw.ReportProgress()方法会触发该事件。

代码语言:javascript
复制
 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //progressBar1是进度条控件,lblInfo是显示信息的lable
            this.progressBar1.Value = e.ProgressPercentage;//显示百分比
            lblInfo.Text = e.UserState.ToString();//显示文字信息。
        }

e.ProgressPercentage是调用bw.ReportProgress()方法时的第一个参数,e.UserState为第二个参数

RunWorkerCompleted

任务完成事件调用方法

代码语言:javascript
复制
 private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //e.Cancelled指示异步操作是否已被取消
            //e.Error 指示异步操作期间发生的错误
            //e.Result 获取异步操作结果的值,即DoWork事件中,Result设置的值。
            if (e.Cancelled)
            {
                this.lblInfo.Text = "用户已经取消操作";
                return;
            }
            if (e.Error != null)
            {
                this.lblInfo.Text = e.Error.Message;
                return ;
            }
            this.lblInfo.Text = e.Result.ToString();
        }

按钮事件

代码语言:javascript
复制
        //开始按钮事件
        private void btnStart_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync(50);
        }
        //结束按钮事件
        private void btnCancel_Click(object sender, EventArgs e)
        {
            backgroundWorker1.CancelAsync();
        }

backgroundWorker1.RunWorkerAsync(50); 开始执行任务,参数50可以在backgroundWorker1_DoWork方法中通过e.Argument取得,在backgroundWorker1_DoWork中有使用。 backgroundWorker1.CancelAsync();取消任务执行,实际上是修改了CancellationPending的值,false变为true 附上demo代码 链接:https://pan.baidu.com/s/1Q-tDzhzagU_kIujuwOCZhg 提取码:vn3q

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 声明backgroundworker并绑定事件
  • DoWork
  • ProgressChanged
  • RunWorkerCompleted
  • 按钮事件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档