WaitResponseQueue队列执行委托
控制台执行主方法
1 while (true) 2 { 3 Thread.Sleep(100); 4 //生成队列的key值 5 var key = Guid.NewGuid().ToString(); 6 //标记插入队列key值顺序 7 Console.WriteLine("输入K:" + key); 8 //异步执行队列插入、读取操作 9 Task.Run(() => 10 { 11 var com = new Communication(); 12 //添加队列 13 com.AddQueue(key); 14 //执行队列 15 com.RunQueue(key); 16 }); 17 18 }
添加队列
1 /// <summary> 2 /// 添加委托方法到执行队列 3 /// </summary> 4 /// <param name="key">队列的key值</param> 5 /// <returns></returns> 6 public string AddQueue(string key) 7 { 8 9 WaitResponseQueue.Add(key, (response) => 10 { 11 //执行等待的时间数组 12 int[] waitTimeList = new[] { 20, 10, 50 }; 13 //从数组随机抽取等待时间 14 var waitTime = waitTimeList.OrderBy(o => Guid.NewGuid()).FirstOrDefault(); 15 //等待 16 Thread.Sleep(waitTime); 17 //执行 18 Console.WriteLine(response); 19 20 21 }); 22 23 return key; 24 }
运行队列
1 /// <summary> 2 /// 运行队列 3 /// </summary> 4 /// <param name="Key"></param> 5 public void RunQueue(string Key) 6 { 7 Thread.Sleep(500); 8 //取出委托方法 9 var responseCallBackFunc = WaitResponseQueue[Key]; 10 //删除字典用的队列 11 WaitResponseQueue.Remove(Key); 12 //执行队列方法 13 responseCallBackFunc.Invoke(Key); 14 }
输出结果
1 输入K:b9bd2d63-7e7c-4465-b99e-6a1cfc57a0a1 2 输入K:03522730-fb07-4ca5-b7b6-85ac7152a6d4 3 输入K:c58c23db-0494-47f4-8f8a-73b940d01401 4 输入K:b0440b48-6803-4b03-8e3e-95d252a63292 5 输入K:e6a777c2-7f7f-4c03-958b-2b97aad3866c 6 输入K:47ea59bf-ad4e-4cb7-b792-70b36aab8a25 7 b9bd2d63-7e7c-4465-b99e-6a1cfc57a0a1 8 输入K:09c820fd-5245-4704-b1ef-65834c8cf445 9 03522730-fb07-4ca5-b7b6-85ac7152a6d4 10 c58c23db-0494-47f4-8f8a-73b940d01401 11 输入K:ecf99839-dcd2-4dbb-8041-80fb4dbbfee4 12 输入K:fb0238bb-eafa-4fc0-bfe1-5e7cf231dbd1 13 b0440b48-6803-4b03-8e3e-95d252a63292 14 输入K:adbf0179-909e-4600-ae84-a30bc1de32ae 15 e6a777c2-7f7f-4c03-958b-2b97aad3866c 16 输入K:0e55a56c-2746-4ea4-8cf2-95701b3858b9 17 47ea59bf-ad4e-4cb7-b792-70b36aab8a25 18 输入K:dbc60c3b-cd49-4d36-b33f-6e46b896d29a 19 09c820fd-5245-4704-b1ef-65834c8cf445 20 ecf99839-dcd2-4dbb-8041-80fb4dbbfee4 21 输入K:5bda1aaa-91fb-400c-aec3-974d9b79727f 22 输入K:2ca5f799-b766-4633-9b90-0f8e835521d3 23 fb0238bb-eafa-4fc0-bfe1-5e7cf231dbd1 24 adbf0179-909e-4600-ae84-a30bc1de32ae 25 输入K:3358fc4c-7074-4bf5-bd90-f43bd1370a4b 26 输入K:473d4d16-ab24-45f8-8961-6303463913b7 27 0e55a56c-2746-4ea4-8cf2-95701b3858b9
由此可看出队列执行方法是同步执行,在不阻塞生产的前提下,按照队列内的顺序依次委托进行消费
注意:不要和异步编程搞混,异步编程参考地址:http://www.skcircle.com/?id=1842