首页 > 学院 > 开发设计 > 正文

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

2019-11-17 02:38:04
字体:
来源:转载
供稿:网友

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

  在实际应用中,经常要让多个方法并行执行以节约运行时间,线程就是必不可少的了,而多线程的管理经常又是一件头疼的事情,比如方法并行执行异步的返回问题,方法并行执行的超时问题等等,因此这里分享一个简易的、轻量级的方法并行执行线程辅助类。

  线程管理辅助类的两个目标:

  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 ThreadHelper10     {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 }
View Code

  使用示例:

 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             try30             {31                 Console.WriteLine("方法{0}执行!");32                 Thread.Sleep(10);33             }34             finally35             {36                 // 方法执行结束37                 this.threadHelper.SetOne();38             }39         }40     }
View Code

  总结:

  1、该线程帮助类只是一个简易的线程管理类,还缺少很多功能,比如异常处理等,不过一般的情况下还是比较使用的。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表