Узел Message Queues в окне Server Explorer в Visual Studio

81

Узел Message Queues, открытый на рисунке ниже, дает разработчику доступ к очередям событий, возможных на его компьютере. Существуют три типа очередей: закрытая (private), которая не возникает по внешнему запросу; открытая (public), которая возникает по внешнему запросу; и системная (system), которая используется для неотправленных сообщений и сообщений о других исключительных событиях.

Узел Message Queues

Для того чтобы использовать узел 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.

Пройди тесты
Лучший чат для C# программистов