BackgroundWorker用法

BackgroundWorker主要用来提供后台运算服务(防止用户前台无响应等待),并提供服务进度的类;

代码如下:

 1 BackgroundWorker  bgw = new BackgroundWorker();
 2             bgw.DoWork += bgw_DoWork;
 3             bgw.RunWorkerAsync();
 4             bgw.RunWorkerCompleted += bgw_RunWorkerCompleted;
 5 //创建对象
 6
 7     void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 8         {
 9             try
10             {
11                 bgw.Dispose();
12                 CommonIdCardRead.CVR_CloseComm();
13             }
14             catch (Exception ex)
15             {
16                 MessageBox.Show(ex.ToString());
17             }
18         }
19
20         void bgw_DoWork(object sender, DoWorkEventArgs e)
21         {
22             try
23             {
24                 while (true)
25                 {
26                     if ((iRetCOM == 1) || (iRetUSB == 1))
27                     {
28                         int authenticate = CommonIdCardRead.CVR_Authenticate();
29                         if (authenticate == 1)
30                         {
31                             int readContent = CommonIdCardRead.CVR_Read_Content(4);
32                             if (readContent == 1)
33                             {
34                                 FillData();
35                             }
36                             else
37                             {
38                                 this.Dispatcher.Invoke(new Action(delegate() { CMessageBox.ShowInfoMessage("读卡操作失败!"); }));
39                                 //CMessageBox.ShowInfoMessage("读卡操作失败!");
40                             }
41                         }
42                         //else
43                         //{
44                         //    this.Dispatcher.Invoke(new Action(delegate() { CMessageBox.ShowInfoMessage("未身份证或身份证放置不正确,请将身份证重新放置。"); }));
45                         //}
46                     }
47                     else
48                     {
49                         if (readSb < 2)
50                             this.Dispatcher.Invoke(new Action(delegate() { CMessageBox.ShowInfoMessage("初始化失败!"); }));
51                         readSb++;
52                     }
53                     if (reBack)
54                         return;
55                     Thread.Sleep(1000);
56                 }
57             }
58             catch (Exception ex)
59             {
60                 this.Dispatcher.Invoke(new Action(delegate() { CMessageBox.ShowInfoMessage(ex.ToString()); }));
61             }
62         }

此代码主要是后台不停读取身份证信息,同时不影响用户前台操作,但是,注意事项有两个:

1、前台元素无法在子线程中直接使用,(提示元素被其他线程使用)

2、当为死循环时候,页面关闭,线程仍然再继续运行。

关于这两个问题,解决办法如下:

1、this.Dispatcher.Invoke(new Action(delegate() { CMessageBox.ShowInfoMessage("初始化失败!"); }));用这种方法可以通过主进程调用相关的控件元素等,
CMessageBox.ShowInfoMessage("初始化失败!"); 为要执行的操作。2、添加外部标识符位,在死循环中判断标识符状态,标示符改变,则跳出死循环,完成complate操作。
BackgroundWorker目前更多的用在进度条显示方面,
BackgroundWorker有是否进度通知属性,和进度改变事件,通过这两个可以在前台动态的显示后台运算业务的完成进度情况
 
时间: 2024-08-02 22:44:41

BackgroundWorker用法的相关文章

winform异步系统升级—BackgroundWorker

BackgroundWorker用法实例 自己的代码,就是要执行的代码写到dowork里,ProgressChanged事件是控制进度时用的,最后的Completed事件进度完成,也就是dowork里的代码执行完成了 public BackgroundWorker bgWork; bgWork = new BackgroundWorker();bgWork.WorkerReportsProgress = true;bgWork.DoWork += new DoWorkEventHandler(b

BackgroundWorker的简单用法

微软的官方例子 BackgroudWorker就是一个封装好的异步处理类(就是多线程,广泛用于winform开发中) 例子: 1.界面效果: 一个label,两个button 2.Form2.cs的代码 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq;

wpf BackgroundWorker 的简单用法

1. 登陆中.. 登陆成功 BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += (o, ea) => { Login(sName, sPassword); }; worker.RunWorkerCompleted += (o, ea) => { if (ea.Error != null) { tbMsg.Text = ea.Error.Message; Password.Clear(); Password.Foc

C# BackgroundWorker 详解

C# BackgroundWorker 详解 在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题.解决这类问题的主要途径是使用多线程,启动一个后台线程,把运算操作放在这个后台线程中完成.但是原生接口的线程操作有一些难度,如果要更进一步的去完成线程间的通信就会难上加难. 还好 .NET 类库中提供了一个叫做 BackgroundWorker 的类可以比较优雅的解决这类问题.虽然BackgroundWorker 类使用起来比较简单,但其

BackgroundWorker原理剖析

BackgroundWorker类位于System.ComponentModel命名空间下,主要用来异步执行一个长时间的操作,然后,在完成事件中安全更新UI的控件属性.UI中的控件是不允许非创建该控件的线程修改的.典型用法如下: BackgroundWorker m_worker = new BackgroundWorker(); // 设置支持进度报告.异步取消功能,默认都为false m_worker.WorkerReportsProgress = true; m_worker.Worker

C# BackgroundWorker使用总结

查询了一下MSDN文档,其中微软就BackgroundWorker类的功能有这么一个描述(英文的,根据个人理解翻译):BackgroundWorker类允许您在单独的线程上执行某个可能导致用户界面(UI)停止响应的耗时操作(比如文件下载数据库事务等),并且想要一个响应式的UI来反应当前耗时操作的进度. 可以看的出来,BackgroundWorker组件提供了一种执行异步操作(后台线程)的同时,并且还能妥妥的显示操作进度的解决方案.于是乎,我便深入的了解了一下BackgroundWorker类.针

js中获取时间new date()的用法

js中获取时间new date()的用法 获取时间:   var myDate = new Date();//获取系统当前时间 获取特定格式的时间: 1 myDate.getYear(); //获取当前年份(2位) 2 myDate.getFullYear(); //获取完整的年份(4位,1970-????) 3 myDate.getMonth(); //获取当前月份(0-11,0代表1月) 4 myDate.getDate(); //获取当前日(1-31) 5 myDate.getDay();

20.5 Shell脚本中的逻辑判断;20.6 文件目录属性判断;20.7 if特殊用法;20.8 20.9 cace判断(上下)

扩展: select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html 20.5 Shell脚本中的逻辑判断 格式1:if 条件 ; then 语句; fi 1. 创建if1.sh测试脚本: [[email protected] ~]# vi if1.sh a=5,如果a大于3,满足这个条件,显示ok 添加内容: #!/bin/bash a=5 if [ $a -gt 3 ] then echo ok fi 2. 执行if1.sh脚本: [[e

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍 1. shell是一种脚本语言 aming_linux blog.lishiming.net 2. 可以使用逻辑判断.循环等语法 3. 可以自定义函数 4. shell是系统命令的集合 5. shell脚本可以实现自动化运维,能大大增加我们的运维效率 20.2 Shell脚本结构和执行 1. 开头(首行)需要加: #!/bin/bash 2. 以#开头的行作为解释说明: 3. 脚本的名字以.sh结尾,用于区分这是一个shell脚本 4. 执行.sh脚本方法有两种: