题
我是从两个应用共享使用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()线程安全?
不隶属于 StackOverflow