zoukankan      html  css  js  c++  java
  • 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有是否进度通知属性,和进度改变事件,通过这两个可以在前台动态的显示后台运算业务的完成进度情况
     
  • 相关阅读:
    pku3225 区间
    pku2136 Vertical Histogram
    NOI2006 最大获利
    APIO2010 特别行动队
    停电两夜
    偷偷乐一把
    那些花儿...
    一件一块钱的小事
    web service 的Section=ResponseStatusLine 错误和skype
    杂谈
  • 原文地址:https://www.cnblogs.com/weiweiboqi/p/4701128.html
Copyright © 2011-2022 走看看