C#--异步显示工作进度

耗时的操作在长时间运行时可能导致用户界面停止响应,这时需要把操作转移到单独的线程上运行,保证当前用户界面可以继续流畅交互,同时还需要实时了解独立线程上的任务进度。可以使用BackgroudWorker解决此类问题。

假设当前线程为主线程,执行耗时任务的线程为独立线程。

需要创建一个BackgroudWorker对象,主要关注这几个事件:

  DoWork:当发出执行后台的信息后,会触发这个事件,响应该事件的方法是处理后台任务的主体。注意:处理该事件的方法不可以调用主线程的控件。

  ProgressChanged:在任务执行过程中,适当时机报告工作进度,此时会触发该事件。注意:处理该事件的方法可以调用主线程的控件。

  RunWorkerCompleted:无论任务如何结束,可能显式停止,也可能发生了异常,此时会触发该事件。注意:处理该事件的方法可以调用主线程的控件。

    public partial class Form1 : Form
    {
        private BackgroundWorker backgroundWorker1;
        public Form1()
        {
            InitializeComponent();
            radProgressBar1.Minimum = 0;
            radProgressBar1.Maximum = 100;
            radProgressBar1.Step = 1;
            radProgressBar1.Value1 = 0;
            backgroundWorker1 = new BackgroundWorker { WorkerSupportsCancellation = true, WorkerReportsProgress = true };
            backgroundWorker1.DoWork += Dowork;
            backgroundWorker1.ProgressChanged += ProgressChanged;
            backgroundWorker1.RunWorkerCompleted += RunWorkerCompleted;
        }

        //启动任务
        private void button2_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy != true)
            {
                backgroundWorker1.RunWorkerAsync();
            }
        }

        //执行任务
        private void Dowork(object sender, DoWorkEventArgs e)
        {
            var worker = sender as BackgroundWorker;
            worker.WorkerReportsProgress = true;
            for (int i=1; i <= 10; i++)
            {
                if (worker.CancellationPending)
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    Thread.Sleep(500);
                    worker.ReportProgress(i * 10);//报告工作进度
                }
            }
        }

        //处理进度报告,此处可以使用主线程的控件
        private void ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            radProgressBar1.Value1 = e.ProgressPercentage * radProgressBar1.Maximum / 100;
        }

        //任务不管以何种方式结束,在该方法中善后
        private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                radProgressBar1.Value1 = 0;
                //todo 取消执行的操作
            }
            else if (e.Error != null)
            {
                radProgressBar1.Value1 = 0;
                //todo 发生错误时执行的操作
            }
            else
            {
                //todo
            }
        }

        //停止线程的操作
        private void button3_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.WorkerSupportsCancellation)
            {
                backgroundWorker1.CancelAsync();
            }
        }
    }

  源代码

  

时间: 2024-11-05 02:22:31

C#--异步显示工作进度的相关文章

异步下载圆形进度条显示进度

圆形进度条参考链接即可:使用css3实现圆形进度条 需求点击下载后遮罩层显示下载进度: 1.圆形进度条参考以上链接,有点小瑕疵,可更改定位距离实现重合. 2.遮罩层: .lbOverlay{ display: none; position: fixed; left: 0; top: 0; zoom: 1; background: black; z-index: 99999; width:100%; height:100%; filter:alpha(opacity=70); /*IE滤镜,透明度

Android中AsyncTask进行后台下载文件并在下拉菜单显示下载进度

在开发过程中,总会需要从网络上下载文件,有时候还需要将下载进度显示在下拉菜单中. 现在写了一个Demo,封装了AsyncTask下载文件和进度显示的代码,以后在做项目的时候能够直接进行使用. 效果图: 主界面只有一个按钮,比较简单: / layout / activity_main.xml : <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="h

Android中如何下载文件并显示下载进度

原文地址:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1125/2057.html 这里主要讨论三种方式:AsyncTask.Service和使用DownloadManager. 一.使用AsyncTask并在进度对话框中显示下载进度 这种方式的优势是你可以在后台执行下载任务的同时,也可以更新UI(这里我们用progress bar来更新下载进度) 下面的代码是使用的例子 1 // declare the dialog as a

关于unity3D异步加载进度条实时更新的方法

在其他地方看到所谓的实时更新就是 让slider的当前value等于异步对象的进度值而已,太坑了,这个正常来理解的意思不就是从0开始递增到100嘛,不管怎么我已经完成这个功能了,代码贴上,以免日后忘记, 找到这篇博客的朋友算你好运,直接搬走吧(NGUI版)~ 需要重点提醒的:异步对象AsyncOperation的值到90%后不会再增长,剩下的10%要让AsyncOperation.allowSceneActivation(意思是场景加载完毕后自动跳转场景)为true时才会自动完成~ 完整代码下方

李新海:新老员工请时时汇报你的工作进度

职场中,什么会帮助你加速升职加薪? 是能力?是忠心?是任劳任怨? 答案是时时向领导汇报你的工作进度. 因为一旦你时时汇报,就会得到如下四个好处. 1.你汇报了,领导就知道你在工作,不汇报,领导就以为你在偷懒. 领导与员工之间,不是敌人,是亲密无间的合作者.员工应该清楚,只有告诉领导,你在想什么,你在做什么,你的领导才会清楚.如果你不说,你做的一切,领导未必能看在眼里. 2.你汇报了,你用的方法一般,领导会给你指导,告诉你更高效的方法,不然就会影响领导想要的效率. 举个例子吧,领导中午十二点安排一

Python HTTP下载文件并显示下载进度条

下面的Python脚本中利用request下载文件并写入到文件系统,利用progressbar模块显示下载进度条. 其中利用request模块下载文件可以直接下载,不需要使用open方法,例如: import urllib import requests.packages.urllib3 requests.packages.urllib3.disable_warnings() url = "https://raw.githubusercontent.com/racaljk/hosts/maste

js异步处理工作机制

js异步处理工作机制 从基础的层面来讲,理解JavaScript的定时器是如何工作的是非常重要的.计时器的执行常常和我们的直观想象不同,那是因为JavaScript引擎是单线程的.我们先来认识一下下面三个函数是如何控制计时器的. var id = setTimeout(fn, delay); - 初始化一个计时器,然后在指定的时间间隔后执行.该函数返回一个唯一的标志ID(Number类型),我们可以使用它来取消计时器. var id = setInterval(fn, delay); - 和se

工作进度报告

工作进度如下: 王扣柱和郭志伟实现地点的选择,能正确找出地点,并在地图上画出. 孔祥安实现地点的景点的介绍. 宫文策实现数据库中增加地点信息:

python实现显示安装进度条

一直很好奇那种安装进度条,或者启动程序时候显示的进度条是怎么实现的,学习了python之后,sys模块中有个方法可以实现,代码如下: 1 2 3 4 5 6 import sys,time for i in range(50):#循环50次 sys.stdout.write('#')#向终端输出# #在这中间就可以做你想要的处理了,处理完之后结束循环即可 sys.stdout.flush()#立即输出,如果不加这个的话,它会等缓冲区满了之后才显示 time.sleep(1)#sleep一秒再输出