C#使用Microsoft消息隊(duì)列(MSMQ)的示例詳解
寫在前面
Microsoft Message Queuing (MSMQ) 是在多個(gè)不同的應(yīng)用之間實(shí)現(xiàn)相互通信的一種異步傳輸模式,相互通信的應(yīng)用可以分布于同一臺(tái)機(jī)器上,也可以分布于相連的網(wǎng)絡(luò)空間中的任一位置。
使用消息隊(duì)列可以實(shí)現(xiàn)異步通訊,無需關(guān)心接收端是否在線,只需發(fā)出后就可以繼續(xù)處理后續(xù)的任務(wù),通訊雙方也可以是不同的物理平臺(tái),該機(jī)制還可以用來實(shí)現(xiàn)故障恢復(fù)。
在使用前,需要先確認(rèn)該功能是否安裝和啟用,如未安裝可以參考以下操作步驟:
進(jìn)入控制面板\所有控制面板項(xiàng)\程序和功能,點(diǎn)擊啟用或關(guān)閉Windows功能,勾選Microsoft消息隊(duì)列,確認(rèn)并安裝。

消息隊(duì)列分為以下幾種,每種隊(duì)列的路徑表示形式如下:
公用隊(duì)列 MachineName\QueueName
專用隊(duì)列 MachineName\Private$\QueueName
日記隊(duì)列 MachineName\QueueName\Journal$
計(jì)算機(jī)日記隊(duì)列 MachineName\Journal$
計(jì)算機(jī)死信隊(duì)列 MachineName\Deadletter$
計(jì)算機(jī)事務(wù)性死信隊(duì)列 MachineName\XactDeadletter$
代碼實(shí)現(xiàn)
需要引用 System.Messaging 類庫
using System.Messaging;
發(fā)送端
public partial class Form1 : Form
{
MessageQueue queue;
string path = ".\\Private$\\testQueue";
public Form1()
{
InitializeComponent();
CreateMessageQueue();
}
private void button1_Click(object sender, EventArgs e)
{
SendMessage(this.textBox1.Text);
}
private void CreateMessageQueue()
{
if(MessageQueue.Exists(path))
{
queue = new MessageQueue(path);
}
else
{
queue = MessageQueue.Create(path);
}
}
private void SendMessage(string str)
{
var message = new System.Messaging.Message();
message.Formatter = new XmlMessageFormatter(new Type[]{ typeof(string)});
message.Body = str;
queue.Send(message);
MessageBox.Show("消息發(fā)送成功");
}
private void SendMessage(Image image)
{
var message = new System.Messaging.Message();
message.Formatter = new BinaryMessageFormatter();
message.Body = image;
queue.Send(message);
MessageBox.Show("圖像發(fā)送成功");
}
private void button2_Click(object sender, EventArgs e)
{
OpenFileDialog open = new OpenFileDialog();
open.Filter = "圖像文件|*.jpg;*.bmp;*.png";
open.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
if(open.ShowDialog() == DialogResult.OK)
{
Image image = Bitmap.FromFile(open.FileName);
SendMessage(image);
}
}
private void button3_Click(object sender, EventArgs e)
{
MessageBox.Show(queue.GetAllMessages().Length.ToString());
}
private void button4_Click(object sender, EventArgs e)
{
queue.Purge();
}
}
接收端
public partial class Form1 : Form
{
MessageQueue queue;
string path = ".\\Private$\\testQueue";
public Form1()
{
InitializeComponent();
CreateMessageQueue();
}
private void button1_Click(object sender, EventArgs e)
{
RecvStringMessage();
}
private void button2_Click(object sender, EventArgs e)
{
RecvImageMessage();
}
private void CreateMessageQueue()
{
if (MessageQueue.Exists(path))
{
queue = new MessageQueue(path);
}
else
{
queue = MessageQueue.Create(path);
}
}
public void RecvStringMessage()
{
if (queue.GetAllMessages().Length == 0)
{
MessageBox.Show("消息隊(duì)列為空");
return;
}
var message = queue.Receive();
message.Formatter = new XmlMessageFormatter(new Type[] {typeof(string) });
MessageBox.Show(message.Body.ToString());
}
public void RecvImageMessage()
{
if (queue.GetAllMessages().Length == 0)
{
MessageBox.Show("消息隊(duì)列為空");
return;
}
var message = queue.Receive();
message.Formatter = new BinaryMessageFormatter();
Image image = (Image)message.Body;
Form form = new Form();
form.Width = 1024;
form.Height = 768;
PictureBox pbox = new PictureBox();
pbox.Width = 1024;
pbox.Height = 768;
pbox.SizeMode = PictureBoxSizeMode.Zoom;
pbox.Image = image;
form.Controls.Add(pbox);
form.ShowDialog();
}
}調(diào)用示例



可以在計(jì)算機(jī)管理中查看到消息隊(duì)列的詳細(xì)信息,還未被接收的消息會(huì)在隊(duì)列消息中看到,被接收并消費(fèi)后即自動(dòng)刪除。

源碼參考:C#消息隊(duì)列MSMQ
以上就是C#使用Microsoft消息隊(duì)列(MSMQ)的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于C# Microsoft消息隊(duì)列的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
winform創(chuàng)建不規(guī)則窗體的方法
這篇文章主要介紹了winform創(chuàng)建不規(guī)則窗體的方法,涉及C#窗體創(chuàng)建的相關(guān)參數(shù)設(shè)置技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-09-09
C#實(shí)現(xiàn)讀取Excel文件并將數(shù)據(jù)寫入數(shù)據(jù)庫和DataTable
Excel文件是存儲(chǔ)表格數(shù)據(jù)的普遍格式,因此能夠高效地讀取和提取信息對于我們來說至關(guān)重要,下面我們就來看看C#如何實(shí)現(xiàn)讀取Excel文件并將數(shù)據(jù)寫入數(shù)據(jù)庫和DataTable吧2024-03-03
C#把數(shù)組中的某個(gè)元素取出來放到第一個(gè)位置的實(shí)現(xiàn)方法
這篇文章主要介紹了C#把數(shù)組中的某個(gè)元素取出來放到第一個(gè)位置的實(shí)現(xiàn)方法,涉及C#針對數(shù)組的常見操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12
C#使用TimeSpan時(shí)間計(jì)算的簡單實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于C#使用TimeSpan時(shí)間計(jì)算的相關(guān)資料,以及通過一個(gè)實(shí)例代碼給大家介紹了C#使用timespan和timer完成一個(gè)簡單的倒計(jì)時(shí)器的方法,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06

