• C#WinForm线程基类


    在CS模式开发中一般我们需要用到大量的线程来处理比较耗时的操作,以防止界面假死带来不好的体验效果,下面我将我定义的线程基类给大家参考下,如有问题欢迎指正。

    基类代码

      1   #region 方法有返回值
      2         /// <summary>
      3         /// 功能描述:多线程执行方法,方法有返回值
      4         /// 作  者:huangzh
      5         /// 创建日期:2017-03-29 17:44:26
      6         /// 任务编号:MES
      7         /// </summary>
      8         /// <param name="func">方法,参数为object[],返回值为object,如果方法中调用了控件,请使用 ThreadInvokerControl(() => { 您的操作})进行包括</param>
      9         /// <param name="objParams">方法参数</param>
     10         /// <param name="callback">执行完成回调,参数使用func返回的值,如果错误返回的是Exception,如果为空则默认调用基类回调方法</param>
     11         /// <param name="enableControl">调用线程时禁用的控件</param>
     12         /// <param name="blnShowSplashScreen">是否显示提示层</param>
     13         /// <param name="enableControl">调用线程时,禁用的控件</param>
     14         /// <param name="strMsg">提示层提示内容,仅当blnShowSplashScreen=true时生效</param>
     15         protected void ThreadRun(Func<List<string>, object> func, List<string> objParams, Action<object> callback, Control[] enableControl = null, bool blnShowSplashScreen = true, string strMsg = null)
     16         {
     17             if (blnShowSplashScreen)
     18             {
     19                 splashScreenManager1.ShowWaitForm();
     20                 splashScreenManager1.SetWaitFormCaption("提示");
     21                 if (string.IsNullOrEmpty(strMsg))
     22                     strMsg = "处理正在进行中,请稍候...";
     23                 splashScreenManager1.SetWaitFormDescription(strMsg);
     24             }
     25             if (enableControl != null)
     26             {
     27                 SetControlEnableds(enableControl, false);
     28             }
     29             Thread th = new Thread(delegate()
     30             {
     31                 try
     32                 {
     33                     object obj = func(objParams);
     34                     if (callback != null)
     35                         callback(obj);
     36                 }
     37                 catch (Exception ex)
     38                 {
     39                     if (callback != null)
     40                         callback(ex);
     41                     else
     42                         ThreadBaseCallBack(ex);
     43                 }
     44                 finally
     45                 {
     46                     if (blnShowSplashScreen)
     47                     {
     48                         ThreadInvokerControl(() => { splashScreenManager1.CloseWaitForm(); });
     49                     }
     50                     if (enableControl != null)
     51                     {
     52                         ThreadInvokerControl(() => { SetControlEnableds(enableControl, true); });
     53                     }
     54                 }
     55             });
     56             th.IsBackground = true;
     57             th.Start();
     58         }
     59         /// <summary>
     60         /// 功能描述:多线程执行方法,方法有返回值
     61         /// 作  者:huangzh
     62         /// 创建日期:2017-03-29 17:44:26
     63         /// 任务编号:MES
     64         /// </summary>
     65         /// <param name="func">方法,参数为object[],返回值为object,如果方法中调用了控件,请使用 ThreadInvokerControl(() => { 您的操作})进行包括</param>
     66         /// <param name="objParams">方法参数</param>
     67         /// <param name="callback">执行完成回调,参数使用func返回的值,如果错误返回的是Exception,如果为空则默认调用基类回调方法</param>
     68         /// <param name="enableControl">调用线程时禁用的控件</param>
     69         /// <param name="blnShowSplashScreen">是否显示提示层</param>
     70         /// <param name="strMsg">提示层提示内容,仅当blnShowSplashScreen=true时生效</param>
     71         protected void ThreadRun(Func<List<object>, object> func, List<object> objParams, Action<object> callback, Control[] enableControl = null, bool blnShowSplashScreen = true, string strMsg = null)
     72         {
     73             if (blnShowSplashScreen)
     74             {
     75                 splashScreenManager1.ShowWaitForm();
     76                 splashScreenManager1.SetWaitFormCaption("提示");
     77                 if (string.IsNullOrEmpty(strMsg))
     78                     strMsg = "处理正在进行中,请稍候...";
     79                 splashScreenManager1.SetWaitFormDescription(strMsg);
     80             }
     81             if (enableControl != null)
     82             {
     83                 SetControlEnableds(enableControl, false);
     84             }
     85             Thread th = new Thread(delegate()
     86             {
     87                 try
     88                 {
     89                     object obj = func(objParams);
     90                     if (callback != null)
     91                         callback(obj);
     92                 }
     93                 catch (Exception ex)
     94                 {
     95                     if (callback != null)
     96                         callback(ex);
     97                     else
     98                         ThreadBaseCallBack(ex);
     99                 }
    100                 finally
    101                 {
    102                     if (blnShowSplashScreen)
    103                     {
    104                         ThreadInvokerControl(() => { splashScreenManager1.CloseWaitForm(); });
    105                     }
    106                     if (enableControl != null)
    107                     {
    108                         ThreadInvokerControl(() => { SetControlEnableds(enableControl, true); });
    109                     }
    110                 }
    111             });
    112             th.IsBackground = true;
    113             th.Start();
    114         }
    115 
    116         /// <summary>
    117         /// 功能描述:多线程执行方法,方法有返回值
    118         /// 作  者:huangzh
    119         /// 创建日期:2017-03-29 17:44:26
    120         /// 任务编号:MES
    121         /// </summary>
    122         /// <param name="func">方法,参数为ictionary<string,object>,返回值为object,如果方法中调用了控件,请使用 ThreadInvokerControl(() => { 您的操作})进行包括</param>
    123         /// <param name="objParams">方法参数</param>
    124         /// <param name="callback">执行完成回调,参数使用func返回的值,如果错误返回的是Exception,如果为空则默认调用基类回调方法</param>
    125         /// <param name="enableControl">调用线程时禁用的控件</param>
    126         /// <param name="blnShowSplashScreen">是否显示提示层</param>
    127         /// <param name="strMsg">提示层提示内容,仅当blnShowSplashScreen=true时生效</param>
    128         protected void ThreadRun(Func<Dictionary<string, object>, object> func, Dictionary<string, object> objParams, Action<object> callback, Control[] enableControl = null, bool blnShowSplashScreen = true, string strMsg = null)
    129         {
    130             if (blnShowSplashScreen)
    131             {
    132                 splashScreenManager1.ShowWaitForm();
    133                 splashScreenManager1.SetWaitFormCaption("提示");
    134                 if (string.IsNullOrEmpty(strMsg))
    135                     strMsg = "处理正在进行中,请稍候...";
    136                 splashScreenManager1.SetWaitFormDescription(strMsg);
    137             }
    138             if (enableControl != null)
    139             {
    140                 SetControlEnableds(enableControl, false);
    141             }
    142             Thread th = new Thread(delegate()
    143             {
    144                 try
    145                 {
    146                     object obj = func(objParams);
    147                     if (callback != null)
    148                         callback(obj);
    149                 }
    150                 catch (Exception ex)
    151                 {
    152                     if (callback != null)
    153                         callback(ex);
    154                     else
    155                         ThreadBaseCallBack(ex);
    156                 }
    157                 finally
    158                 {
    159                     if (blnShowSplashScreen)
    160                     {
    161                         ThreadInvokerControl(() => { splashScreenManager1.CloseWaitForm(); });
    162                     }
    163                     if (enableControl != null)
    164                     {
    165                         ThreadInvokerControl(() => { SetControlEnableds(enableControl, true); });
    166                     }
    167                 }
    168             });
    169             th.IsBackground = true;
    170             th.Start();
    171         }
    172 
    173         /// <summary>
    174         /// 功能描述:多线程执行方法,方法无参数,有返回值
    175         /// 作  者:huangzh
    176         /// 创建日期:2017-03-29 17:44:26
    177         /// 任务编号:MES
    178         /// </summary>
    179         /// <param name="func">方法,返回值为object,如果方法中调用了控件,请使用 ThreadInvokerControl(() => { 您的操作})进行包括</param>
    180         /// <param name="objParams">方法参数</param>
    181         /// <param name="callback">执行完成回调,参数使用func返回的值,如果错误返回的是Exception,如果为空则默认调用基类回调方法</param>
    182         /// <param name="enableControl">调用线程时禁用的控件</param>
    183         /// <param name="blnShowSplashScreen">是否显示提示层</param>
    184         /// <param name="strMsg">提示层提示内容,仅当blnShowSplashScreen=true时生效</param>
    185         protected void ThreadRun(Func<object> func, Action<object> callback, Control[] enableControl = null, bool blnShowSplashScreen = true, string strMsg = null)
    186         {
    187             if (blnShowSplashScreen)
    188             {
    189                 splashScreenManager1.ShowWaitForm();
    190                 splashScreenManager1.SetWaitFormCaption("提示");
    191                 if (string.IsNullOrEmpty(strMsg))
    192                     strMsg = "处理正在进行中,请稍候...";
    193                 splashScreenManager1.SetWaitFormDescription(strMsg);
    194             }
    195             if (enableControl != null)
    196             {
    197                 SetControlEnableds(enableControl, false);
    198             }
    199             Thread th = new Thread(delegate()
    200             {
    201                 try
    202                 {
    203                     object obj = func();
    204                     if (callback != null)
    205                         callback(obj);
    206                 }
    207                 catch (Exception ex)
    208                 {
    209                     if (callback != null)
    210                         callback(ex);
    211                     else
    212                         ThreadBaseCallBack(ex);
    213                 }
    214                 finally
    215                 {
    216                     if (blnShowSplashScreen)
    217                     {
    218                         ThreadInvokerControl(() => { splashScreenManager1.CloseWaitForm(); });
    219                     }
    220                     if (enableControl != null)
    221                     {
    222                         ThreadInvokerControl(() => { SetControlEnableds(enableControl, true); });
    223                     }
    224                 }
    225             });
    226             th.IsBackground = true;
    227             th.Start();
    228         }
    229         #endregion
    230 
    231         #region 方法无返回值
    232         /// <summary>
    233         /// 功能描述:多线程执行方法,方法无返回值
    234         /// 作  者:huangzh
    235         /// 创建日期:2017-03-29 17:44:26
    236         /// 任务编号:MES
    237         /// </summary>
    238         /// <param name="func">方法,参数为object[],如果方法中调用了控件,请使用 ThreadInvokerControl(() => { 您的操作})进行包括</param>
    239         /// <param name="objParams">方法参数</param>
    240         /// <param name="callback">执行完成回调,参数为object,如果错误返回的是Exception,否则为null,如果为空则默认调用基类回调方法</param>
    241         /// <param name="enableControl">调用线程时禁用的控件</param>
    242         /// <param name="blnShowSplashScreen">是否显示提示层</param>
    243         /// <param name="strMsg">提示层提示内容,仅当blnShowSplashScreen=true时生效</param>
    244         protected void ThreadRunExt(Action<List<string>> func, List<string> objParams, Action<object> callback, Control[] enableControl = null, bool blnShowSplashScreen = true, string strMsg = null)
    245         {
    246             if (blnShowSplashScreen)
    247             {
    248                 splashScreenManager1.ShowWaitForm();
    249                 splashScreenManager1.SetWaitFormCaption("提示");
    250                 if (string.IsNullOrEmpty(strMsg))
    251                     strMsg = "处理正在进行中,请稍候...";
    252                 splashScreenManager1.SetWaitFormDescription(strMsg);
    253             }
    254             if (enableControl != null)
    255             {
    256                 SetControlEnableds(enableControl, false);
    257             }
    258             Thread th = new Thread(delegate()
    259             {
    260                 try
    261                 {
    262                     func(objParams);
    263                     if (callback != null)
    264                         callback(null);
    265                 }
    266                 catch (Exception ex)
    267                 {
    268                     if (callback != null)
    269                         callback(ex);
    270                     else
    271                         ThreadBaseCallBack(ex);
    272                 }
    273                 finally
    274                 {
    275                     if (blnShowSplashScreen)
    276                     {
    277                         ThreadInvokerControl(() => { splashScreenManager1.CloseWaitForm(); });
    278                     }
    279                     if (enableControl != null)
    280                     {
    281                         ThreadInvokerControl(() => { SetControlEnableds(enableControl, true); });
    282                     }
    283                 }
    284             });
    285             th.IsBackground = true;
    286             th.Start();
    287         }
    288         /// <summary>
    289         /// 功能描述:多线程执行方法,方法无返回值
    290         /// 作  者:huangzh
    291         /// 创建日期:2017-03-29 17:44:26
    292         /// 任务编号:MES
    293         /// </summary>
    294         /// <param name="func">方法,参数为object[],如果方法中调用了控件,请使用 ThreadInvokerControl(() => { 您的操作})进行包括</param>
    295         /// <param name="objParams">方法参数</param>
    296         /// <param name="callback">执行完成回调,参数为object,如果错误返回的是Exception,否则为null,如果为空则默认调用基类回调方法</param>
    297         /// <param name="enableControl">调用线程时禁用的控件</param>
    298         /// <param name="blnShowSplashScreen">是否显示提示层</param>
    299         /// <param name="strMsg">提示层提示内容,仅当blnShowSplashScreen=true时生效</param>
    300         protected void ThreadRunExt(Action<List<object>> func, List<object> objParams, Action<object> callback, Control[] enableControl = null, bool blnShowSplashScreen = true, string strMsg = null)
    301         {
    302             if (blnShowSplashScreen)
    303             {
    304                 splashScreenManager1.ShowWaitForm();
    305                 splashScreenManager1.SetWaitFormCaption("提示");
    306                 if (string.IsNullOrEmpty(strMsg))
    307                     strMsg = "处理正在进行中,请稍候...";
    308                 splashScreenManager1.SetWaitFormDescription(strMsg);
    309             }
    310             if (enableControl != null)
    311             {
    312                 SetControlEnableds(enableControl, false);
    313             }
    314             Thread th = new Thread(delegate()
    315             {
    316                 try
    317                 {
    318                     func(objParams);
    319                     if (callback != null)
    320                         callback(null);
    321                 }
    322                 catch (Exception ex)
    323                 {
    324                     if (callback != null)
    325                         callback(ex);
    326                     else
    327                         ThreadBaseCallBack(ex);
    328                 }
    329                 finally
    330                 {
    331                     if (blnShowSplashScreen)
    332                     {
    333                         ThreadInvokerControl(() => { splashScreenManager1.CloseWaitForm(); });
    334                     }
    335                     if (enableControl != null)
    336                     {
    337                         ThreadInvokerControl(() => { SetControlEnableds(enableControl, true); });
    338                     }
    339                 }
    340             });
    341             th.IsBackground = true;
    342             th.Start();
    343         }
    344         /// <summary>
    345         /// 功能描述:多线程执行方法,方法无返回值
    346         /// 作  者:huangzh
    347         /// 创建日期:2017-03-29 17:44:26
    348         /// 任务编号:MES
    349         /// </summary>
    350         /// <param name="func">方法,参数为ictionary<string,object>,如果方法中调用了控件,请使用 ThreadInvokerControl(() => { 您的操作})进行包括</param>
    351         /// <param name="objParams">方法参数</param>
    352         /// <param name="callback">执行完成回调,参数为object,如果错误返回的是Exception,否则为null,如果为空则默认调用基类回调方法</param>
    353         /// <param name="enableControl">调用线程时禁用的控件</param>
    354         /// <param name="blnShowSplashScreen">是否显示提示层</param>
    355         /// <param name="strMsg">提示层提示内容,仅当blnShowSplashScreen=true时生效</param>
    356         protected void ThreadRunExt(Action<Dictionary<string, object>> func, Dictionary<string, object> objParams, Action<object> callback, Control[] enableControl = null, bool blnShowSplashScreen = true, string strMsg = null)
    357         {
    358             if (blnShowSplashScreen)
    359             {
    360                 splashScreenManager1.ShowWaitForm();
    361                 splashScreenManager1.SetWaitFormCaption("提示");
    362                 if (string.IsNullOrEmpty(strMsg))
    363                     strMsg = "处理正在进行中,请稍候...";
    364                 splashScreenManager1.SetWaitFormDescription(strMsg);
    365             }
    366             if (enableControl != null)
    367             {
    368                 SetControlEnableds(enableControl, false);
    369             }
    370             Thread th = new Thread(delegate()
    371             {
    372                 try
    373                 {
    374                     func(objParams);
    375                     if (callback != null)
    376                         callback(null);
    377                 }
    378                 catch (Exception ex)
    379                 {
    380                     if (callback != null)
    381                         callback(ex);
    382                     else
    383                         ThreadBaseCallBack(ex);
    384                 }
    385                 finally
    386                 {
    387                     if (blnShowSplashScreen)
    388                     {
    389                         ThreadInvokerControl(() => { splashScreenManager1.CloseWaitForm(); });
    390                     }
    391                     if (enableControl != null)
    392                     {
    393                         ThreadInvokerControl(() => { SetControlEnableds(enableControl, true); });
    394                     }
    395                 }
    396             });
    397             th.IsBackground = true;
    398             th.Start();
    399         }
    400 
    401         /// <summary>
    402         /// 功能描述:多线程执行方法,方法无参数无返回值
    403         /// 作  者:huangzh
    404         /// 创建日期:2017-03-29 17:44:26
    405         /// 任务编号:MES
    406         /// </summary>
    407         /// <param name="func">方法,如果方法中调用了控件,请使用 ThreadInvokerControl(() => { 您的操作})进行包括</param>
    408         /// <param name="objParams">方法参数</param>
    409         /// <param name="callback">执行完成回调,参数为object,如果错误返回的是Exception,否则为null,如果为空则默认调用基类回调方法</param>
    410         /// <param name="enableControl">调用线程时禁用的控件</param>
    411         /// <param name="blnShowSplashScreen">是否显示提示层</param>
    412         /// <param name="strMsg">提示层提示内容,仅当blnShowSplashScreen=true时生效</param>
    413         protected void ThreadRunExt(Action func, Action<object> callback, Control[] enableControl = null, bool blnShowSplashScreen = true, string strMsg = null)
    414         {
    415             if (blnShowSplashScreen)
    416             {
    417                 splashScreenManager1.ShowWaitForm();
    418                 splashScreenManager1.SetWaitFormCaption("提示");
    419                 if (string.IsNullOrEmpty(strMsg))
    420                     strMsg = "处理正在进行中,请稍候...";
    421                 splashScreenManager1.SetWaitFormDescription(strMsg);
    422             }
    423             if (enableControl != null)
    424             {
    425                 SetControlEnableds(enableControl, false);
    426             }
    427             Thread th = new Thread(delegate()
    428             {
    429                 try
    430                 {
    431                     func();
    432                     if (callback != null)
    433                         callback(null);
    434                 }
    435                 catch (Exception ex)
    436                 {
    437                     if (callback != null)
    438                         callback(ex);
    439                     else
    440                         ThreadBaseCallBack(ex);
    441                 }
    442                 finally
    443                 {
    444                     if (blnShowSplashScreen)
    445                     {
    446                         ThreadInvokerControl(() => { splashScreenManager1.CloseWaitForm(); });
    447                     }
    448                     if (enableControl != null)
    449                     {
    450                         ThreadInvokerControl(() => { SetControlEnableds(enableControl, true); });
    451                     }
    452                 }
    453             });
    454             th.IsBackground = true;
    455             th.Start();
    456         }
    457         #endregion
    458 
    459         /// <summary>
    460         /// 功能描述:委托调用,用于夸线程访问控件
    461         /// 作  者:huangzh
    462         /// 创建日期:2017-03-29 17:58:53
    463         /// 任务编号:MES
    464         /// </summary>
    465         /// <param name="action">action</param>
    466         /// <param name="f">所在窗体,默认使用当前窗体</param>
    467         protected void ThreadInvokerControl(Action action, Form frm = null)
    468         {
    469             if (frm == null)
    470                 frm = this;
    471             frm.BeginInvoke(action);
    472         }
    473 
    474         /// <summary>
    475         /// 功能描述:线程默认回调方法
    476         /// 作  者:huangzh
    477         /// 创建日期:2017-03-29 19:31:19
    478         /// 任务编号:MES
    479         /// </summary>
    480         /// <param name="obj">obj</param>
    481         private void ThreadBaseCallBack(object obj)
    482         {
    483             if (obj is Exception)
    484             {
    485                 ThreadInvokerControl(() => { throw obj as Exception; });
    486             }
    487         }
    488 
    489 
    490         #region 禁用控件时不改变空间颜色
    491         [System.Runtime.InteropServices.DllImport("user32.dll ")]
    492         private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int wndproc);
    493         [System.Runtime.InteropServices.DllImport("user32.dll ")]
    494         private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
    495 
    496         private const int GWL_STYLE = -16;
    497         private const int WS_DISABLED = 0x8000000;
    498 
    499         /// <summary>
    500         /// 功能描述:设置控件的Enable属性,控件不改颜色
    501         /// 作  者:huangzh
    502         /// 创建日期:2017-03-30 09:01:45
    503         /// 任务编号:MES
    504         /// </summary>
    505         /// <param name="c">c</param>
    506         /// <param name="enabled">enabled</param>
    507         public void SetControlEnabled(Control c, bool enabled)
    508         {
    509             if (enabled)
    510             {
    511                 SetWindowLong(c.Handle, GWL_STYLE, (~WS_DISABLED) & GetWindowLong(c.Handle, GWL_STYLE));
    512             }
    513             else
    514             {
    515                 SetWindowLong(c.Handle, GWL_STYLE, WS_DISABLED + GetWindowLong(c.Handle, GWL_STYLE));
    516             }
    517         }
    518         /// <summary>
    519         /// 功能描述:设置多个控件的Enable属性,控件不改颜色
    520         /// 作  者:huangzh
    521         /// 创建日期:2017-03-30 09:07:12
    522         /// 任务编号:MES
    523         /// </summary>
    524         /// <param name="cs">cs</param>
    525         /// <param name="enabled">enabled</param>
    526         public void SetControlEnableds(Control[] cs, bool enabled)
    527         {
    528             foreach (var c in cs)
    529             {
    530                 SetControlEnabled(c, enabled);
    531             }
    532         }
    533         #endregion
    View Code

    再看使用方法

    1             Dictionary<string, object> para = new Dictionary<string, object>();
    2             para.Add("strConfig", "1");
    3             para.Add("strTypeValue", "2");
    4           
    5             ThreadRunExt(GetSource, para, null, new Control[] { this.xtabMain });
    View Code
    1  private void GetSource(Dictionary<string, object> para)
    2         {.....}
    View Code
  • 相关阅读:
    Android核心分析之十七电话系统之rilD
    Android核心分析之十六Android电话系统-概述篇
    Android核心分析之十五Android输入系统之输入路径详解
    Android核心分析之十四Android GWES之输入系统
    Android 核心分析之十三Android GWES之Android窗口管理
    Android 核心分析之十二Android GEWS窗口管理之基本架构原理
    Android核心分析 之十一Android GWES之消息系统
    Android核心分析 之十Android GWES之基本原理篇
    Android核心分析 之九Zygote Service
    Android 核心分析 之八Android 启动过程详解
  • 原文地址:https://www.cnblogs.com/bfyx/p/6644421.html
Copyright © 2020-2023  润新知