[C#]一个简易的、轻量级的方法并行执行线程辅助类

 

一个简易的、轻量级的方法并行执行线程辅助类   在实际应用中,经常要让多个方法并行执行以节约运行时间,线程就是必不可少的了,而多线程的管理经常又是一件头疼的事情,比如方法并行执行异步的返回问题,方法并行执行的超时问题等等,因此这里分享一个简易的、轻量级的方法并行执行线程辅助类。
  线程管理辅助类的两个目标:
  1、多个线程方法并行执行,主线程等待,需要知道所有子线程执行完毕;
  2、异步执行方法需要设置超时时间,超时可以跳过该方法,主线程直接返回;
  3、轻量级,虽然微软提供了线程等待、超时等可用组件,如ManualResetEvent,但那是内核对象,占用系统资源较多。
  设计实现:
  1、该类内部维护两个变量,异步执行方法总线程数totalThreadCount,当前执行完毕线程数据currThreadCount;
  2、两个开放方法,WaitAll等待执行,SetOne设置方法执行结束,每一个方法执行完毕调用SetOne,currThreadCount数量加1,同时WaitAll判断currThreadCount与totalThreadCount是否相等,相等即表示所有方法执行完毕,返回;
  3、为了实现线程安全,currThreadCount的变量处理使用Interlocked。
  代码实现:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading;
 6 
 7 namespace Loncin.CodeGroup10.Utility
 8 {
 9     public class ThreadHelper
10     {
11         /// <summary>
12         /// 总线程数
13         /// </summary>
14         private int totalThreadCount;
15 
16         /// <summary>
17         /// 当前执行完毕线程数
18         /// </summary>
19         private int currThreadCount;
20 
21         /// <summary>
22         /// 构造函数
23         /// </summary>
24         /// <param name="totalThreadCount">总线程数</param>
25         public ThreadHelper(int totalThreadCount)
26         {
27             Interlocked.Exchange(ref this.totalThreadCount, totalThreadCount);
28             Interlocked.Exchange(ref this.currThreadCount, 0);
29         }
30 
31         /// <summary>
32         /// 等待所有线程执行完毕
33         /// </summary>
34         /// <param name="overMiniseconds">超时时间(毫秒)</param>
35         public void WaitAll(int overMiniseconds = 0)
36         {
37             int checkCount = 0;
38 
39             // 自旋
40             while (Interlocked.CompareExchange(ref this.currThreadCount, 0, this.totalThreadCount) != this.totalThreadCount)
41             {
42                 // 超过超时时间返回
43                 if (overMiniseconds > 0)
44                 {
45                     if (checkCount >= overMiniseconds)
46                     {
47                         break;
48                     }
49                 }
50 
51                 checkCount++;
52 
53                 Thread.Sleep(1);
54             }
55         }
56 
57         /// <summary>
58         /// 设置信号量,表示单线程执行完毕
59         /// </summary>
60         public void SetOne()
61         {
62             Interlocked.Increment(ref this.currThreadCount);
63         }
64     }
65 }
 1 public class ThreadHelperTest
 2     {
 3         /// <summary>
 4         /// 线程帮助类
 5         /// </summary>
 6         private ThreadHelper threadHelper;
 7 
 8         public void Test()
 9         {
10             // 开启方法方法并行执行
11             int funcCount = 5;
12 
13             this.threadHelper = new ThreadHelper(funcCount);
14 
15             for (int i = 0; i < funcCount; i++)
16             {
17                 Action<int> action = new Action<int>(TestFunc);
18                 action.BeginInvoke(i, null, null);
19             }
20 
21             // 等待方法执行,超时时间12ms,12ms后强制结束
22             threadHelper.WaitAll(12);
23 
24             Console.WriteLine("所有方法执行完毕!");
25         }
26 
27         private void TestFunc(int i)
28         {
29             try
30             {
31                 Console.WriteLine("方法{0}执行!");
32                 Thread.Sleep(10);
33             }
34             finally
35             {
36                 // 方法执行结束
37                 this.threadHelper.SetOne();
38             }
39         }
40     }

 

转载于:https://www.cnblogs.com/test404/p/6737471.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
超级多的C#辅助大全 网上有各式各样的帮助,公共,但是比较零碎,经常有人再群里或者各种社交账号上问有没有这个helper,那个helper,于是萌生了收集全部helper的念头,以便日后使用。各式各样的几乎都能找到,所有功能性代码都是独立的之间没有联系,可以单独引用至项目。 1. C#读取AD域里用户名或组 2. Chart图形 3. cmd 4. Cookie&Session 5. CSV文件转换 6. DataTable转实体 7. DBHelper 8. DecimalUtility及中文大写数字 9. DLL 10. Excel操作 11. FTP操作 12. H5-微信 13. Html操作 14. INI文件读写 15. IP辅助 16. Javascript 17. Json 18. JSON操作 19. JS操作 20. Lib 21. Mime 22. Net 23. NPOI 24. obj 25. packages 26. Path 27. PDF 28. Properties 29. QueryString 地址栏参数 30. RDLC直接打印帮助 31. ResourceManager 32. RMB 33. SqlHelper 34. SQL语句拦截器 35. URL的操作 36. VerifyCode 37. XML操作 38. 上传下载 39. 二维码操作 40. 共用工具 41. 其他 42. 分词辅助 43. 分页 44. 加密解密 45. 压缩解压缩 46. 各种验证帮助 47. 图片 48. 图片操作 49. 图片验证码 50. 处理多媒体的公共 51. 处理枚举 52. 字符串 53. 对象转换处理 54. 帮助文档 55. 序列化 56. 异步线程 57. 弹出消息 58. 数据展示控件绑定数据 59. 文件操作 60. 日历 61. 日志 62. 时间戳 63. 时间操作 64. 条形码 65. 条形码帮助 66. 条形码转HTML 67. 检测是否有Sql危险字符 68. 正则表达式 69. 汉字转拼音 70. 注册表操作 71. 科学计数,数学 72. 型转换 73. 系统操作相关的公共 74. 缓存 75. 网站安全 76. 网站路径操作 77. 网络 78. 视频帮助 79. 视频转换 80. 计划任务 81. 邮件 82. 邮件2 83. 配置文件操作 84. 阿里云 85. 随机数 86. 页面辅助 87. 验证码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值