某些场景并发量太高,需要采用队列辅助,特此备注:多线程队列,先进先出某些情况也会用到阻塞当前线程,等待服务c#教程器返回或者耗时的处理,这种情况,可采用信号量辅助
1 ManualResetEvent allDone = new ManualResetEvent(false);//初始化,开启阻塞
2 allDone.Reset();//信号量重置,状态为阻塞
3 allDone.WaitOne(5*1000);//阻塞当前线程,最大等待5秒
4 allDone.Set();//释放信号量,将阻塞的线程继续向下
口水话注解:调用了Set方法将事件设为true后,不会去调用Reset方法,这将导致事件一直处于true,其它等待的多个线程都会得到执行,直到你手动调用Reset方法。
相当于你把门打开后,需要手动去关(非自动门)。
1 AutoResetEvent ReciveResetEvent = new System.Threading.AutoResetEvent(true);//初始化,未开启阻塞
2 ReciveResetEvent.WaitOne(30000);//阻塞
3 ReciveResetEvent.Set();//释放后,自动开启阻塞
口水话注解:调用了Set方法将事件设为true之后,其中一个等待线程得到执行后,它会自动调用Reset方法,将事件信号设为false,以阻塞其它的线程。
相当于放一个线程进来,门自动就关了(自动门)。
1 /*
2 例子:
3
4 //初始化后台处理消息线程
5 AsyncQueueDataProcessor<string> asyncQueueDetector = new AsyncQueueDataProcessor<string>();
6 asyncQueueDetector.ProcessData += AsyncQueue_ProcessData;//事件里处理有数据时
7 asyncQueueDetector.Start();
8
9 服务启动后,使用 asyncQueueDetector.AppendData 追加数据到队列
10 */
11
12
13 /// <summary>
14 /// 异步处理队列数据
15 /// </summary>
16 /// <typeparam name="T"></typeparam>
17 public class AsyncQueueDataProcessor<T> : IDisposable
18 {
19 #region 成员变量
20
21 /// <summary>
22 /// 待处理的数据队列
23 /// </summary>
24 ConcurrentQueue<T> DataQueue;
25
26 /// <summary>
27 /// 数据处理定时器
28 /// </summary>
29 Timer processTimer;
30
31 #endregion
32
33 #region 构造函数
34
35 /// <summary>
36 /// 初始化
37 /// </summary>
38 /// <param name="intervalMillSecond"></param>
39 public AsyncQueueDataProcessor(int intervalMillSecond = 120)
40 {
41 DataQueue = new ConcurrentQueue<T>();
42 processTimer = new Timer(intervalMillSecond);
43 processTimer.Elapsed += ProcessTimer_Elapsed;
44 processTimer.AutoReset = false;
45 }
46
47 #endregion
48
49 #region 自定义事件
50
51 /// <summary>
52 /// 数据抛出时触发
53 /// </summary>
54 public event EventHandler<T> ProcessData;
55
56 #endregion
57
58 #region 公共方法
59
60 /// <summary>
61 /// 释放所有资源
62 /// </summary>
63 public void Dispose()
64 {
65 processTimer.Dispose();
66 ClearData();
67 }
68
69 /// <summary>
70 /// 开始处理数据
71 /// </summary>
72 public void Start()
73 {
74 processTimer.Start();
75 }
76
77 /// <summary>
78 /// 停止处理数据
79 /// </summary>
80 public void Stop()
81 {
82 processTimer.Stop();
83 }
84
85 /// <summary>
86 /// 追加数据到队列
87 /// </summary>
88 /// <param name="data"></param>
89 public void AppendData(T data)
90 {
91 DataQueue.Enqueue(data);
92 }
93
94 /// <summary>
95 /// 清空队列数据
96 /// </summary>
97 public void ClearData()
98 {
99 do
100 {
101 } while (DataQueue.TryDequeue(out T t));
102 }
103 #endregion
104
105 #region 事件
106
107 //处理数据时执行
108 private void ProcessTimer_Elapsed(object sender, ElapsedEventArgs e)
109 {
110 T t;
111 if (DataQueue.TryDequeue(out t))
112 {
113 if (ProcessData != null)
114 {
115 try
116 {
117 ProcessData(this, t);
118 }
119 catch (Exception exp)
120 {
121 Debug.WriteLine($"队列里面发生了未处理的异常-{exp.Message}\r\n{exp.StackTrace}");
122 }
123 }
124 }
125
126 processTimer.Start();
127 }
128
129 #endregion
130 }