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有是否进度通知属性,和进度改变事件,通过这两个可以在前台动态的显示后台运算业务的完成进度情况
 
原文地址:https://www.cnblogs.com/weiweiboqi/p/4701128.html