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
再看使用方法
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 {.....}
作者:冰封一夏
出处:http://www.cnblogs.com/bfyx/
HZHControls官网:http://www.hzhcontrols.cn
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,
且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git