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-10-03 22:54:49