2015-05-09 76 views
-1

我有一個控制檯應用程序。在這個應用程序中,我會聯繫一個隊列。首先我檢查是否存在例如名稱爲'exampleQueue'的隊列是否存在。如果它不存在,我創建它。 之後創建和returing路徑或只是返回路徑。我想將ReceiveCompleted事件附加到此隊列中。 我有兩種方法,我可以使用'使用'關鍵字使我的工作後排隊的隊列,或者我可以使用正常的方式來創建隊列對象。Microsoft消息隊列ReceiveCompleted事件

在下面ü可以看到我的代碼:

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      CreateQueue(".\\exampleQueue", false); 
      using (var queue = new MessageQueue(".\\exampleQueue")) 
      { 
       queue.ReceiveCompleted += MyReceiveCompleted; 
       queue.BeginReceive(); 
      } 
     } 
     public static void CreateQueue(string queuePath, bool transactional) 
     { 
      if (!MessageQueue.Exists(queuePath)) 
      { 
       MessageQueue.Create(queuePath, transactional); 
      } 
      else 
      { 
       Console.WriteLine(queuePath + " already exists."); 
      } 
     } 
     private static void MyReceiveCompleted(Object source, 
      ReceiveCompletedEventArgs asyncResult) 
     { 
      var queue = (MessageQueue)source; 
      try 
      { 
       var msg = queue.EndReceive(asyncResult.AsyncResult); 
       Console.WriteLine("Message body: {0}", (string)msg.Body); 
       queue.BeginReceive(); 
      } 
      catch (Exception ex) 
      { 
       var s = ex; 
      } 
      finally 
      { 
       queue.BeginReceive(); 
      } 
      return; 
     } 
    } 
} 

,我面對的是,每當我用這個代碼創建隊列對象

using (var queue = new MessageQueue(".\\exampleQueue")) 
      { 
       queue.ReceiveCompleted += MyReceiveCompleted; 
       queue.BeginReceive(); 
      } 

的MyReceiveCompleted事件不能正常工作的問題。 但是當我使用這個

var queue = new MessageQueue(".\\exampleQueue"); 
      queue.ReceiveCompleted += MyReceiveCompleted; 
      queue.BeginReceive(); 

每一件事只是在適當的方式工作。

我的問題是哪個程序是最好的? 如果我選擇使用第一個程序,我該如何使它工作?

接受我的不好打字的道歉。

+0

您的隊列對象將是由垃圾收集清理。 using語句導致立即調用dispose。將您的隊列變量更改爲程序類的靜態變量。基本上隊列正在清理之前,你的事件可以觸發。 – Nattrass

+0

tnx你的答案。我不知道我是否沒有處理我的對象。它在生產使用中會成爲問題嗎?我的意思是說,在1周或1個月之後,該對象不會影響性能? – elhampour

+0

是的,垃圾收集器仍然會在將來某個未確定的點上垃圾你的隊列對象,並且你的ReceiveCompleted事件不會觸發。 – Nattrass

回答

1

您可以使用原來的做法,但你必須確保,該Main方法阻止使用語句中:

static void Main(string[] args) 
{ 
    CreateQueue(".\\exampleQueue", false); 

    using (var queue = new MessageQueue(".\\exampleQueue")) 
    { 
     queue.ReceiveCompleted += MyReceiveCompleted; 
     queue.BeginReceive(); 

     // here you have to insert code to block the 
     // execution of the Main method. 
     // Something like: 
     while(Console.ReadLine() != "exit") 
     { 
      // do nothing 
     } 
    } 
}