我是从两个应用共享使用MSMQ一个队列浏览源代码。第一应用具有写入到队列,而第二应用具有另一个线程从队列中读取一个线程。通常情况下,如果你实现自己的队列中,应用程序将访问队列时,对需要互斥?但是,我无法找到这些应用程序的源代码的任何互斥/关键部分。难道我只是错过了什么?或者根本MSMQ不需要任何互斥体,因为它是内部处理的,是有这样的事?

有帮助吗?

解决方案

MSMQ 文档指出:

  

只有下列方法是线程   安全:BeginPeek,BeginReceive,   EndPeek(IAsyncResult的),   EndReceive(IAsyncResult的),   GetAllMessages,PEEK和接收。

MSMQ.Send()是<强> 固有线程安全的。

  

发送是线程安全的,只要你   总是发送消息的对象,从来没有   使用直接发送一个.NET对象。运用   消息对象,顺便说一句,始终是一个   好主意 - 因为它可以让你添加   标签,超时,可采选项   而这一切的东西,让你的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