关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

云南大王-多线程,队列,先进先出、信号量...

发布时间:2020-04-13 00:00:00
某些场景并发量太高,需要采用队列辅助,特此备注:多线程队列,先进先出 某些情况也会用到阻塞当前线程,等待服务器返回或者耗时的处理,这种情况,可采用信号量辅助 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 asyncQueueDetector = new AsyncQueueDataProcessor(); 6 asyncQueueDetector.ProcessData += AsyncQueue_ProcessData;//事件里处理有数据时 7 asyncQueueDetector.Start(); 8 9 服务启动后,使用 asyncQueueDetector.AppendData 追加数据到队列 10 */ 11 12 13 /// 14 /// 异步处理队列数据 15 /// 16 /// 17 public class AsyncQueueDataProcessor : IDisposable 18 { 19 #region 成员变量 20 21 /// 22 /// 待处理的数据队列 23 /// 24 ConcurrentQueue DataQueue; 25 26 /// 27 /// 数据处理定时器 28 /// 29 Timer processTimer; 30 31 #endregion 32 33 #region 构造函数 34 35 /// 36 /// 初始化 37 /// 38 /// 39 public AsyncQueueDataProcessor(int intervalMillSecond = 120) 40 { 41 DataQueue = new ConcurrentQueue(); 42 processTimer = new Timer(intervalMillSecond); 43 processTimer.Elapsed += ProcessTimer_Elapsed; 44 processTimer.AutoReset = false; 45 } 46 47 #endregion 48 49 #region 自定义事件 50 51 /// 52 /// 数据抛出时触发 53 /// 54 public event EventHandler ProcessData; 55 56 #endregion 57 58 #region 公共方法 59 60 /// 61 /// 释放所有资源 62 /// 63 public void Dispose() 64 { 65 processTimer.Dispose(); 66 ClearData(); 67 } 68 69 /// 70 /// 开始处理数据 71 /// 72 public void Start() 73 { 74 processTimer.Start(); 75 } 76 77 /// 78 /// 停止处理数据 79 /// 80 public void Stop() 81 { 82 processTimer.Stop(); 83 } 84 85 /// 86 /// 追加数据到队列 87 /// 88 /// 89 public void AppendData(T data) 90 { 91 DataQueue.Enqueue(data); 92 } 93 94 /// 95 /// 清空队列数据 96 /// 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 }  

/template/Home/Zkeys/PC/Static