首页 > 代码库 > 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
再看使用方法
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 });
1 private void GetSource(Dictionary<string, object> para)2 {.....}
C#WinForm线程基类
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。