1.在服務電腦上打開 消息隊列
①進入控制面板》程序》啟用或關閉windows功能
②將需要的勾選(我自己全選了哈哈哈)
③我的電腦 右鍵 打開管理 見到消息隊列 在專用隊列上新建專用隊列
⑤填寫名稱還有選擇是否是事務性
好到這里就基本准備完成
下面就要使用隊列 來發送消息
//創建消息隊列 並發送消息到隊列 try { //連接到本地新創建的隊列 MessageQueue myQueue = new MessageQueue(".\\private$\\test2"); //創建一個消息 System.Messaging.Message myMessage = new System.Messaging.Message(); //給消息體賦值 myMessage.Body = "你好我是消息體"; myMessage.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) }); //發送消息到隊列中(創建隊列時勾選了事務性之后 不能直接使用 public void Send(object obj) 這個方法 因為其不支持事務) // 我要使用下面這個支持事務的發送方法 myQueue.Send(myMessage,System.Messaging.MessageQueueTransactionType.Single); } catch (ArgumentException ex) { Console.WriteLine(ex.Message); }
發完消息之后就要接收消息
消息的接受使用Receive()方法
但是該方法會阻塞線程
所以建議將其放到一個獨立的線程中,不讓其影響其他線程的運行
//創建一個任務 讓其不斷的在接收消息隊列發出的消息 Task t = Task.Factory.StartNew(() => { while (true) { //創建隊列 要跟發消息的隊列同一個名稱 MessageQueue mq = new MessageQueue(@".\private$\test2"); // 如果不用多線程就會阻塞在Receive System.Messaging.Message m = mq.Receive(); //定義內容格式 m.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) }); //接收到消息后 回去更新主線程的UI界面 Action<String> AsyncUIDelegate = delegate (string n) { this.ReceiveText2.Text = n; //對ui的操作 };//定義一個委托 this.ReceiveText2.Invoke(AsyncUIDelegate, new object[] { m.Body.ToString() }); } });
測試效果:
啊啊啊啊 要記住勾選了事務性 不要用send(object ) 這個方法呀