alielie
2025-11-21 3a471ae651b228231bebb3a2d438baa1d4ac0261
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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();
        }
    }
}