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

 
基本操作:
bgw.RunWorkerAsync() :
开始后台运行执行,
该函数后将触发bgw.DoWorker事件,需要执行的操作写在DoWorker事件响应函数里,
该函数也可以加参数,参数从DoWorker事件处理函数的e.Arguement里获取
 
bgw.CancelAsync() :
申请后台程序停止,
注意该函数不能实际停止后台程序,只能将bgw的CancellationPending 值设为true,需要自己在后台运行的程序中判断这一值,进而停止后台程序的运行.
注意本方法使用前,需要将bgw的WorkerSupportsCancellation 值设为true,否则将不起作用.
 
bgw.ReportProgress() :
在后台程序中调用,向主线程传送进度信息,
可以带一个或两个参数,一个为INT类型的进度(0~100),一个为自定义类型的参数,可以传任意信息.
调用后,将触发bgw.ProgressChanged事件,可以将界面变化的代码写在该事件响应函数中,之前提到的两个参数均可从bgw.ProgressChanged事件响应函数的参数e中获取,分别为e.ProgressPercentage和e.UserState.
注意本方法使用前,需要将bgw的WorkerReportsProgress值设为true,否则将不会触发事件.

开始后台运行:
  1. bgw= new BackgroundWorker();
  2. bgw.WorkerSupportsCancellation = true;
  3. bgw.WorkerReportsProgress = true;
  4. bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
  5. bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
  6. bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
  7. bgw.RunWorkerAsync();
 
DoWork事件处理函数:
  1. void bgw_DoWork(object sender, DoWorkEventArgs e)
  2. {
  3. StartProgress();
  4. }
 
WorkerCompleted事件处理函数(该函数在后台处理完成后被触发)
  1. void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  2. {
  3. MessageBox.Show("处理完成");
  4. }
 
ProgressChanged事件处理函数,
  1. void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
  2. {
  3. if (e.UserState is int)
  4. {
  5. progressBar1.Value = (int)e.ProgressPercentage;
  6. label2.Text = e.UserState.ToString();
  7. }
  8. else if (e.UserState is List<object>)
  9. {
  10. List<object> tmp = (List<object>)e.UserState;
  11. progressBar1.Value = e.ProgressPercentage;
  12. label2.Text = tmp[0].ToString();
  13. this.label1.Text = tmp[1].ToString();
  14. this.listBox1.Items.Insert(0, tmp[2]);
  15. }
  16. }
 
后台运行的代码
  1. private void StartProgress()
  2. {
  3. //do sth
  4. bgw.ReportProgress(per,paraInt);
  5. }

BackgroundWorker的使用的更多相关文章

  1. C# BackgroundWorker 详解

    在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题.解决这类问题的主要途径是使用多线程,启动一个后台线程,把运算操作放在这个后台线程中完 ...

  2. 【Winform】使用BackgroundWorker控制进度条显示进度

    许多开发者看见一些软件有进度条显示进度,自己想弄,项目建好后发现并没有自己想象中的那么简单...看了网上很多教程后,写了一个小Demo供网友们参考~~,Demo的网址:http://pan.baidu ...

  3. C# 多線程&BackgroundWorker概念入門教程

    感謝以下各位作者的貢獻~ 百度經驗舉了個例子,很好理解BackgroundWorker的用途(主要是用來啟動後台線程,而不阻塞調用程式的運行),收藏一下  http://jingyan.baidu.c ...

  4. 【C#】【Thread】BackgroundWorker的使用

    BackgroundWorker 可以用于启动后台线程. 主要的事件及参数: 1.DoWork --当执行BackgroundWorker.RunWorkerAsync方法时会触发该事件,并且传递Do ...

  5. 用于异步的BackgroundWorker

    XAML代码: <Window x:Class="backgroundtest.MainWindow" xmlns="http://schemas.microsof ...

  6. C# 使用BackgroundWorker例子及注意点

    该例子为使用BackgroundWorker在TextBox文本中产生一个10000以内并且能被5整除的数(1秒产生一个) 操作界面可以启动线程,也可以停止线程,界面设计如图: 先贴代码,有注释的地方 ...

  7. C# BackgroundWorker组件学习入门介绍

    C# BackgroundWorker组件学习入门介绍 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能 ...

  8. winform异步系统升级—BackgroundWorker

    BackgroundWorker用法实例 自己的代码,就是要执行的代码写到dowork里,ProgressChanged事件是控制进度时用的,最后的Completed事件进度完成,也就是dowork里 ...

  9. BackgroundWorker组件的作用

    当构建一个图形化的Windows Form桌面应用程序并且需要执行在应用程序主UI线程之外的线程中长时间的任务时,BackgroundWorker类就很有用了. 要使用BackgroundWorker ...

  10. C# BackgroundWorker的使用

    文章摘自:http://www.cnblogs.com/tom-tong/archive/2012/02/22/2363965.html BackgroundWorker 可以用于启动后台线程. 主要 ...

随机推荐

  1. Java程序设计的基本原则

    Java程序设计的基本原则-1 1.面向对象 这是java编程里面大家公认的第一原则 2.优先使用对象组合而非类继承 3.分层 最典型的三层架构,表现层-->逻辑层-->数据层 表现层功能 ...

  2. php--无限极分类

    效果图:

  3. [LeetCode]题解(python):088 Merge Sorted Array

    题目来源 https://leetcode.com/problems/merge-sorted-array/ Given two sorted integer arrays nums1 and num ...

  4. 去除undefined和末尾逗号及把字符串数字转成数字数组的方法

    function removeundefined(str){   var v=new Array(),b="";   var tmp=fil(str); for(var i=0;i ...

  5. Swift-04-Designated&&Convenience

    class ClassA { let numA:Int init(num: Int){ numA = num } } class ClassB: ClassA { let numB:Int overr ...

  6. Asset Store

    Asset Store 是用来供Unity开发者将自己的插件拿出来供大家有偿使用的一个平台. 报错信息: failed to import package with error cannot impo ...

  7. OrderSessionHelper查看订单在session是否存在的辅助类

    1. package com.biotool.web.controller.helper; import org.apache.commons.lang3.StringUtils; import ja ...

  8. sell-- 英文网站产品显示404?

    1. 简介: 通过在主页(header.jsp)查询B22212,在localhost本地, cn和us查询的结果search.jsp中显示都是没有找到! 但是在外网(www),cn能够查询到,并展示 ...

  9. iOS 使用封装的NSLog来打印调试信息

    //DLog代替NSLog //debugMethod() 代替 NSLog(@"%s", __func__) //DLog在release下不会输出 #ifdef DEBUG # ...

  10. js获取时间戳

    1.var now = Date.parse(new Date()); //例:1467342220000 获取的时间戳是把毫秒改成000显示. 2.var now = new Date().valu ...