2010-02-24 89 views
2

我正在瀏覽使用MSMQ共享一個隊列的兩個應用程序的源代碼。第一個應用程序有一個寫入隊列的線程,而第二個應用程序有另一個線程從隊列中讀取。通常,如果你正在實現自己的隊列,訪問隊列時應用程序需要一個互斥鎖,對吧?但是,我無法在這些應用程序的源代碼中找到任何互斥/關鍵部分。我錯過了什麼嗎?或者MSMQ不需要任何互斥體,因爲它在內部處理,有沒有這樣的事情?MSMQ中需要互斥嗎?

回答

2

MSMQ文檔指出:

只有以下方法是線程安全的 :BeginPeek,BeginReceive, EndPeek(IAsyncResult的), EndReceive(IAsyncResult的), GetAllMessages,皮克和接收。

MSMQ.Send()是本質上就是線程安全的。

發送是線程安全的,只要你 總是發送消息的對象,從來沒有 使用直接發送一個.NET對象。使用 消息對象,BTW,始終是一個好主意 - 因爲它允許您添加標籤,超時,可恢復選項 和所有這些使您的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); 
     } 
    } 
} 

來源:Is Send() thread safe?

+0

我不知道如果我明白你的最後一句話。在每個線程上創建一個單獨的隊列實例,並讓MSMQ處理來自不同線程的消息 - 我需要使用互斥鎖嗎? – jasonline 2010-02-24 03:29:29

+0

是的,如果我在每個線程上創建一個單獨的MSMQ對象實例,那麼我不需要使用一個互斥對嗎? – jasonline 2010-02-24 03:37:30

+0

其實,更多的挖掘後請看我更新的答案... – 2010-02-24 03:38:45