【c#】队列(Queue)和MSMQ(消息队列)的基础使用
2021-07-10 14:07
标签:task span ret html return collect tostring arch 点击 首先我们知道队列是先进先出的机制,所以在处理并发是个不错的选择。然后就写两个队列的简单应用。 命名空间:System.Collections,不在这里做过多的理论解释,这个东西非常的好理解。 可以看下官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.queue?view=netframework-4.7.2 我这里就是为了方便记忆做了一个基本的例子,首先创建了QueueTest类: 包含了获取队列的数量,入队和出队的实现 为了模拟并发情况下也不会出现重复读取和插入混乱的问题所以写了TaskTest类里面开辟了两个异步线程进行插入和读取: 然后在main函数直接调用即可: 通过上面的截图可以看出插入线程是无先后的。 这张去除也是线程无先后,但是数据是根据插入的数据顺序取的,也就是说多线程取随便取,但是取的数据是根据插入的顺序取值。 msmq是微软提供的消息队列,本来在windows系统中就存在,但是默认没有开启。需要开启。 打开控制面板=>程序和功能=> 启动或关闭windows功能 => Microsoft Message Queue(MSMQ)服务器=>Microsoft Message Queue(MSMQ)服务器核心 一般选择:MSMQ Active Directory域服务继承和MSMQ HTTP支持即可。 点击确定等待安装成功。 需要引用System.Messaging.DLL 命名空间:System.Messaging 官方资料文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.messaging.messagequeue?view=netframework-4.7.2 与上面queue同样的示例方式,创建一个MSMQ类,实现创建消息队列,查询数据,入列,出列功能: 这里说明一下path这个字段,这是消息队列的文件位置和队列名称,我这里写的“.”(点)就是代表的位置MachineName字段,,代表本机的意思 然后TaskTest类修改成这个样子: 创建成功的消息队列我们可以在电脑上查看:我的电脑=>管理 =>计算机管理 =>服务与应用程序 =>消息队列 =>专用队列就看到我刚才创建的消息队列 【c#】队列(Queue)和MSMQ(消息队列)的基础使用 标签:task span ret html return collect tostring arch 点击 原文地址:https://www.cnblogs.com/lonelyxmas/p/9678717.htmlQueue
命名空间
示例代码
1 public class QueueTest
2 {
3 public static Queuestring> q = new Queuestring>();
4
5 #region 获取队列数量
6 public int GetCount()
7 {
8
9 return q.Count;
10 }
11 #endregion
12
13 #region 队列添加数据
14 public void IntoData(string qStr)
15 {
16 string threadId = System.Threading.Thread.CurrentThread.ManagedThreadId.ToString();
17 q.Enqueue(qStr);
18 Console.WriteLine($"队列添加数据: {qStr};当前线程id:{threadId}");
19 }
20 #endregion
21
22 #region 队列输出数据
23
24 public string OutData()
25 {
26 string threadId = System.Threading.Thread.CurrentThread.ManagedThreadId.ToString();
27 string str = q.Dequeue();
28 Console.WriteLine($"队列输出数据: {str};当前线程id:{threadId}");
29 return str;
30 }
31 #endregion
32
33 }
1 class TaskTest
2 {
3
4 #region 队列的操作模拟
5 public static void QueueMian()
6 {
7 QueueA();
8 QueueB();
9 }
10 private static async void QueueA()
11 {
12 QueueTest queue = new QueueTest();
13 var task = Task.Run(() =>
14 {
15 for (int i = 0; i 20; i++)
16 {
17 queue.IntoData("QueueA" + i);
18 }
19 });
20 await task;
21 Console.WriteLine("QueueAA插入完成,进行输出:");
22
23 while (queue.GetCount() > 0)
24 {
25 queue.OutData();
26 }
27 }
28
29 private static async void QueueB()
30 {
31 QueueTest queue = new QueueTest();
32 var task = Task.Run(() =>
33 {
34 for (int i = 0; i 20; i++)
35 {
36 queue.IntoData("QueueB" + i);
37 }
38 });
39 await task;
40 Console.WriteLine("QueueB插入完成,进行输出:");
41
42 while (queue.GetCount() > 0)
43 {
44 queue.OutData();
45 }
46 }
47 #endregion
48
49 }
效果展示
MSMQ
开启安装
命名空间
示例代码
1 ///
1 class TaskTest
2 {
3
4 #region 消息队列的操作模拟
5 public static void MSMQMian()
6 {
7 MSMQ.Createqueue(".\\Private$\\myQueue");
8 MSMQA();
9 MSMQB();
10 Console.WriteLine("MSMQ结束");
11 }
12 private static async void MSMQA()
13 {
14 var task = Task.Run(() =>
15 {
16 for (int i = 0; i 20; i++)
17 {
18 MSMQ.SendMessage("MSMQA" + i);
19 }
20 });
21 await task;
22 Console.WriteLine("MSMQA发送完成,进行读取:");
23
24 while (MSMQ.GetMessageCount() > 0)
25 {
26 MSMQ.ReceiveMessage();
27 }
28 }
29
30 private static async void MSMQB()
31 {
32 var task = Task.Run(() =>
33 {
34 for (int i = 0; i 20; i++)
35 {
36 MSMQ.SendMessage("MSMQB" + i);
37 }
38 });
39 await task;
40 Console.WriteLine("MSMQB发送完成,进行读取:");
41
42 while (MSMQ.GetMessageCount() > 0)
43 {
44 MSMQ.ReceiveMessage();
45 }
46 }
47 #endregion
效果展示
本机查看消息队列
文章标题:【c#】队列(Queue)和MSMQ(消息队列)的基础使用
文章链接:http://soscw.com/index.php/essay/103260.html