Узел Message Queues в окне Server Explorer в Visual Studio
81Программы --- Visual Studio --- Узел Message Queues в окне Server Explorer
Узел Message Queues, открытый на рисунке ниже, дает разработчику доступ к очередям событий, возможных на его компьютере. Существуют три типа очередей: закрытая (private), которая не возникает по внешнему запросу; открытая (public), которая возникает по внешнему запросу; и системная (system), которая используется для неотправленных сообщений и сообщений о других исключительных событиях.
Для того чтобы использовать узел Message Queues, необходимо убедиться, что на компьютере установлено свойство MSMQ. Это можно сделать с помощью подраздела Программы и компоненты панели управления Windows. Для того чтобы включить свойство Microsoft Message Queue (MSMQ) Server, необходимо выполнить команду Включение или отключение компонентов Windows и установить флажок Microsoft Message Queue (MSMQ) Server.
На рисунке очередь сообщений samplequeue добавлена в узел Private Queues после выбора команды Create Queue из контекстного меню, открывающегося щелчком правой кнопкой мыши. Создав очередь и перетащив ее в новую форму типа Windows Form, можно создать соответственно настроенный экземпляр класса MessageQueue. Для того чтобы продемонстрировать функциональные возможности объекта класса MessageQueue, добавим в форму два поля ввода и кнопку, как показано на рисунке ниже. Кнопка "Отправить" заставляет объект класса MessageQueue послать сообщение, введенное в первом поле ввода. Если с формой произойдет событие Load, то будет создан фоновый поток, непрерывно опрашивающий очередь в ожидании сообщения, которое будет выведено во втором поле.
using System;
using System.Windows.Forms;
namespace AppForms
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
var monitorThread = new System.Threading.Thread(MonitorMessageQueue);
monitorThread.IsBackground = true;
monitorThread.Start();
}
private void button1_Click(object sender, EventArgs e)
{
this.messageQueue1.Send(this.textBox1.Text);
}
private void MonitorMessageQueue()
{
var m = default(System.Messaging.Message);
while (true)
{
try
{
m = this.messageQueue1.Receive(new TimeSpan(0, 0, 0, 0, 50));
this.ReceiveMessage((string)m.Body);
}
catch (System.Messaging.MessageQueueException ex)
{
if (!(ex.MessageQueueErrorCode ==
System.Messaging.MessageQueueErrorCode.IOTimeout))
{
throw ex;
}
}
System.Threading.Thread.Sleep(10000);
}
}
private delegate void MessageDel(string msg);
private void ReceiveMessage(string msg)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new MessageDel(ReceiveMessage), msg);
return;
}
this.textBox2.Text = msg;
}
}
}
Обратите внимание на то, что в этом сниппете фоновый поток нигде явно не закрывается. Поскольку свойство IsBackground этого потока установлено равным True, он автоматически закрывается, когда приложение прекращает работу. Как и в предыдущем примере, поскольку обработка сообщения происходит в фоновом потоке, разработчик должен переключить потоки при обновлении пользовательского интерфейса с помощью метода BeginInvoke. Учитывая все вышесказанное, получаем форму, приведенную на рисунке.
Как только сообщение будет послано в очередь сообщений, оно появится в соответствующей очереди в окне Server Explorer. Щелкнув на этом сообщении, можно увидеть его содержимое в окне Properties.