2个程序之间使用消息队列进行通信。
该代码只适用.NET Framework 版本,如果是.NET Core 请使用其他第三方消息队列框架,因为.NET Core 对System.Messaging
已经不支持呢。
进程1用于创建消息队列,然后发送消息。
代码如下:
using System;
using System.Messaging;
namespace App1
{
internal class Program
{
static void Main()
{
// 消息队列路径
string queuePath = @".\Private$\MyQueue";
// 创建或获取消息队列
MessageQueue queue;
if (MessageQueue.Exists(queuePath))
queue = new MessageQueue(queuePath);
else
queue = MessageQueue.Create(queuePath);
// 持续发送消息
while (true)
{
Console.WriteLine("Enter the message to send (or 'exit' to quit):");
string input = Console.ReadLine();
if (input.ToLower() == "exit")
break;
// 发送消息
Message message = new Message(input);
queue.Send(message);
Console.WriteLine("Message sent from Process 1.");
}
Console.ReadLine();
}
}
}
注:
1.string queuePath = @".\Private$\MyQueue";MyQueue
是自己取的队列名称,前面的可以当成默认写法。
2.使用Send
去发送数据,数据可以是任何类型。
进程2用于接收消息队列中的消息。
代码如下:
using System;
using System.Messaging;
using System.Text;
using System.Threading;
namespace App2
{
internal class Program
{
static void Main(string[] args)
{
// 消息队列路径
string queuePath = @".\Private$\MyQueue";
// 创建或获取消息队列
MessageQueue queue;
if (MessageQueue.Exists(queuePath))
queue = new MessageQueue(queuePath);
else
{
Console.WriteLine("No messages available.");
Console.ReadLine();
return;
}
try
{
// 不断接收和处理消息
while (true)
{
// 接收消息,设置超时时间为1秒
// Message message = queue.Receive(TimeSpan.FromSeconds(1));
Message message = queue.Receive();
// 读取消息内容
using (var reader = new System.IO.StreamReader(message.BodyStream, Encoding.UTF8))
{
string messageBody = reader.ReadToEnd();
Console.WriteLine("Message received in Process 2: " + messageBody);
}
Thread.Sleep(1000);
}
}
catch (MessageQueueException ex)
{
// 如果等待超时或发生其他消息队列异常,则打印错误信息
Console.WriteLine("Error receiving message: " + ex.Message);
}
Console.ReadLine();
}
}
}
queue.Receive()
用于接收消息,如果没有收到消息他会处于阻塞状态,直到收到消息。(你也可以设置接收时间,超过了这个时间就会超时。)
消息的接收采用流式接收,具体接收可以和你发送的数据格式进行约定,比如发送JSON
就是JSON
格式接收。