using System;
|
using System.Messaging;
|
using System.Threading;
|
using System.Threading.Tasks;
|
|
namespace HMI.MQUtil
|
{
|
public class MQConnector : IDisposable
|
{
|
private MessageQueue myQueue = null;
|
|
public MQConnector(string name)
|
{
|
string mqName = $".\\private$\\{name}";
|
//如果不存在mqName消息队列,则创建该mqName消息队列
|
if (!MessageQueue.Exists(mqName))
|
{
|
MessageQueue.Create(mqName);
|
|
myQueue = new MessageQueue(mqName);
|
myQueue.SetPermissions("Everyone", MessageQueueAccessRights.FullControl, AccessControlEntryType.Allow); //加权限
|
myQueue.SetPermissions("ANONYMOUS LOGON", MessageQueueAccessRights.FullControl, AccessControlEntryType.Allow);
|
}
|
else
|
{
|
myQueue = new MessageQueue(mqName);
|
}
|
}
|
|
public MQConnector(string host, string name)
|
{
|
string mqName = $@"FormatName:Direct=TCP:{host}\Private$\{name}";
|
if (!MessageQueue.Exists(mqName))
|
{
|
MessageQueue.Create(mqName);
|
|
myQueue = new MessageQueue(mqName);
|
myQueue.SetPermissions("Everyone", MessageQueueAccessRights.FullControl, AccessControlEntryType.Allow); //加权限
|
myQueue.SetPermissions("ANONYMOUS LOGON", MessageQueueAccessRights.FullControl, AccessControlEntryType.Allow);
|
}
|
else
|
{
|
myQueue = new MessageQueue(mqName);
|
}
|
}
|
|
public void ClearAll()
|
{
|
myQueue?.Purge();
|
}
|
|
public void Close()
|
{
|
myQueue?.Close();
|
}
|
|
|
|
ManualResetEvent signal = new ManualResetEvent(false);
|
|
public void BeginReceive(Action<string> action)
|
{
|
Task.Run(() =>
|
{
|
//这里使用了委托,当接收消息完成的时候就执行MyReceiveCompleted方法
|
myQueue.ReceiveCompleted += new ReceiveCompletedEventHandler((source, e) =>
|
{
|
try
|
{
|
MessageQueue mq = (MessageQueue)source;
|
//完成指定的异步接收操作
|
Message message = mq.EndReceive(e.AsyncResult);
|
signal.Set();
|
action(message.Body.ToString());
|
mq.BeginReceive();
|
}
|
catch (MessageQueueException)
|
{
|
|
}
|
});
|
myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });
|
myQueue.BeginReceive();
|
signal.WaitOne();
|
});
|
}
|
|
private void MyReceiveCompleted(Object source, ReceiveCompletedEventArgs asyncResult)
|
{
|
|
}
|
|
public bool SendMessage(string message)
|
{
|
myQueue.Send(message);
|
return true;
|
}
|
|
public bool SendUIMessage(int eventCode, int number, string message)
|
{
|
myQueue.Send($"{eventCode}|{number}|{message}");
|
return true;
|
}
|
|
public void Dispose()
|
{
|
Close();
|
}
|
}
|
}
|