首页 > 代码库 > C#WinForm线程基类

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                 finally101                 {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         /// 作  者:huangzh119         /// 创建日期:2017-03-29 17:44:26120         /// 任务编号:MES121         /// </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                 try145                 {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                     else155                         ThreadBaseCallBack(ex);156                 }157                 finally158                 {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         /// 作  者:huangzh176         /// 创建日期:2017-03-29 17:44:26177         /// 任务编号:MES178         /// </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                 try202                 {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                     else212                         ThreadBaseCallBack(ex);213                 }214                 finally215                 {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         #endregion230 231         #region 方法无返回值232         /// <summary>233         /// 功能描述:多线程执行方法,方法无返回值234         /// 作  者:huangzh235         /// 创建日期:2017-03-29 17:44:26236         /// 任务编号:MES237         /// </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                 try261                 {262                     func(objParams);263                     if (callback != null)264                         callback(null);265                 }266                 catch (Exception ex)267                 {268                     if (callback != null)269                         callback(ex);270                     else271                         ThreadBaseCallBack(ex);272                 }273                 finally274                 {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         /// 作  者:huangzh291         /// 创建日期:2017-03-29 17:44:26292         /// 任务编号:MES293         /// </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                 try317                 {318                     func(objParams);319                     if (callback != null)320                         callback(null);321                 }322                 catch (Exception ex)323                 {324                     if (callback != null)325                         callback(ex);326                     else327                         ThreadBaseCallBack(ex);328                 }329                 finally330                 {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         /// 作  者:huangzh347         /// 创建日期:2017-03-29 17:44:26348         /// 任务编号:MES349         /// </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                 try373                 {374                     func(objParams);375                     if (callback != null)376                         callback(null);377                 }378                 catch (Exception ex)379                 {380                     if (callback != null)381                         callback(ex);382                     else383                         ThreadBaseCallBack(ex);384                 }385                 finally386                 {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         /// 作  者:huangzh404         /// 创建日期:2017-03-29 17:44:26405         /// 任务编号:MES406         /// </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                 try430                 {431                     func();432                     if (callback != null)433                         callback(null);434                 }435                 catch (Exception ex)436                 {437                     if (callback != null)438                         callback(ex);439                     else440                         ThreadBaseCallBack(ex);441                 }442                 finally443                 {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         #endregion458 459         /// <summary>460         /// 功能描述:委托调用,用于夸线程访问控件461         /// 作  者:huangzh462         /// 创建日期:2017-03-29 17:58:53463         /// 任务编号:MES464         /// </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         /// 作  者:huangzh477         /// 创建日期:2017-03-29 19:31:19478         /// 任务编号:MES479         /// </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         /// 作  者:huangzh502         /// 创建日期:2017-03-30 09:01:45503         /// 任务编号:MES504         /// </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             else514             {515                 SetWindowLong(c.Handle, GWL_STYLE, WS_DISABLED + GetWindowLong(c.Handle, GWL_STYLE));516             }517         }518         /// <summary>519         /// 功能描述:设置多个控件的Enable属性,控件不改颜色520         /// 作  者:huangzh521         /// 创建日期:2017-03-30 09:07:12522         /// 任务编号:MES523         /// </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

 

C#WinForm线程基类