-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();
每一件事只是在適當的方式工作。
我的問題是哪個程序是最好的? 如果我選擇使用第一個程序,我該如何使它工作?
接受我的不好打字的道歉。
您的隊列對象將是由垃圾收集清理。 using語句導致立即調用dispose。將您的隊列變量更改爲程序類的靜態變量。基本上隊列正在清理之前,你的事件可以觸發。 – Nattrass
tnx你的答案。我不知道我是否沒有處理我的對象。它在生產使用中會成爲問題嗎?我的意思是說,在1周或1個月之後,該對象不會影響性能? – elhampour
是的,垃圾收集器仍然會在將來某個未確定的點上垃圾你的隊列對象,並且你的ReceiveCompleted事件不會觸發。 – Nattrass