Вопрос

Я просматриваю исходные коды из двух приложений, совместно использующих одну очередь, используя MSMQ.Первое приложение имеет поток, который записывает данные в очередь, в то время как второе приложение имеет другой поток, который считывает данные из очереди.Обычно, если вы реализуете свою собственную очередь, приложениям потребуется мьютекс при доступе к очереди, верно?Однако я не смог найти ни одного мьютекса / критического раздела в исходных кодах этих приложений.Я только что что-то пропустил?Или MSMQ не нуждается в каком-либо мьютексе, поскольку он обрабатывается внутренне, есть ли такая вещь?

Это было полезно?

Решение

В MSMQ документация гласит, что:

Несколько резьбы только следующие методы безопасный:Начинайте просмотр, начинайте получать, Завершайте просмотр (IAsyncResult), Завершайте просмотр (IAsyncResult), Получайте все сообщения, просматривайте и получайте.

MSMQ.Send() - это не по своей сути потокобезопасен.

Отправка потокобезопасна, если вы всегда отправляете объект Message и никогда не используйте send a .NET object напрямую.Использование объекта Message, кстати, всегда является хорошей идеей, поскольку он позволяет добавлять метки, тайм-ауты, восстанавливаемый параметр и все это, что делает ваш MSMQ решение настоящее корпоративное решение.

class Program
{
    static MessageQueue outQueue;
    static void Main(string[] args)
    {
        outQueue = new MessageQueue(@".\private$\mtQueue"); 

        for (int i = 0; i < 100; i++)
        {
            Thread thr = new Thread(new ThreadStart(MyThreadProc));

            thr.Start();
        }
    } 

    static void MyThreadProc()
    {
        Message msg = new Message();
        for (int i = 0; i < 100; i++)
        {
            msg.Label = string.Format("{0} : {1}",
                                     Thread.CurrentThread.ManagedThreadId,
                                      i);
            outQueue.Send(msg);
        }
    }
}

От: Является ли Send() потокобезопасным?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top