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 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(); } } }