一个简易的、轻量级的方法并行执行线程辅助类_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 一个简易的、轻量级的方法并行执行线程辅助类

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

 2015/1/14 16:28:23  loncin  程序员俱乐部  我要评论(0)
  • 摘要:在实际应用中,经常要让多个方法并行执行以节约运行时间,线程就是必不可少的了,而多线程的管理经常又是一件头疼的事情,比如方法并行执行异步的返回问题,方法并行执行的超时问题等等,因此这里分享一个简易的、轻量级的方法并行执行线程辅助类。线程管理辅助类的两个目标:1、多个线程方法并行执行,主线程等待,需要知道所有子线程执行完毕;2、异步执行方法需要设置超时时间,超时可以跳过该方法,主线程直接返回;3、轻量级,虽然微软提供了线程等待、超时等可用组件,如ManualResetEvent,但那是内核对象
  • 标签:方法 一个 执行 线程

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

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

  1、多个线程方法并行执行,主线程等待,需要知道所有子线程执行完毕;

  2、异步执行方法需要设置超时时间,超时可以跳过该方法,主线程直接返回;

  3、轻量级,虽然微软提供了线程等待、超时等可用组件,如ManualResetEvent,但那是内核对象,占用系统资源较多。

  设计实现:

  1、该类内部维护两个变量,异步执行方法总线程数totalThreadCount,当前执行完毕线程数据currThreadCount;

  2、两个开放方法,WaitAll等待执行,SetOne设置方法执行结束,每一个方法执行完毕调用SetOne,currThreadCount数量加1,同时WaitAll判断currThreadCount与totalThreadCount是否相等,相等即表示所有方法执行完毕,返回;

  3、为了实现线程安全,currThreadCount的变量处理使用Interlocked。

  代码实现:

class="code_img_closed" src="/Upload/Images/2015011416/0015B68B3C38AA5B.gif" alt="" />logs_code_hide('72fc745d-d4bc-4688-ab22-b12e65142449',event)" src="/Upload/Images/2015011416/2B1B950FA3DF188F.gif" alt="" />
 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 }
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             try
30             {
31                 Console.WriteLine("方法{0}执行!");
32                 Thread.Sleep(10);
33             }
34             finally
35             {
36                 // 方法执行结束
37                 this.threadHelper.SetOne();
38             }
39         }
40     }
View Code

  总结:

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

发表评论
用户名: 匿名