我在其他帖子上看到過這個錯誤,但不是針對這種確切情況。MessageQueue多於一次丟棄
我有兩個類與MessageQueue做同樣的事情。因此,我將隊列的創建和處理抽象爲助手類。我收到這個錯誤,我看不到隊列可以多次處理。
對象「消息隊列」可以設置比在方法「MsmqHelper.DisposeQueue(的MessageQueue)」
在類中的一個,一旦這是隊列如何使用更多:
private MessageQueue _messageQueue;
然後在類的構造函數:
this._messageQueue = MsmqHelper.InitializeQueue();
不在於它真的很重要,但對完整,這裏是其中使用的隊列:
this._messageQueue.Send(workflowCreated);
而且這裏的處置方法:
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (disposing == false) { return; }
MsmqHelper.DisposeQueue(this._messageQueue);
}
而且這是在助手類,它實際上是調用Dispose()方法的代碼:
public static void DisposeQueue(MessageQueue messageQueue)
{
if (messageQueue != null)
{
messageQueue.Close();
messageQueue.Dispose();
messageQueue = null;
}
}
哪裏是有可能的隊列在這種情況下不止一次處置?
**編輯**
我認爲這將是很好的補充我的意見,在下面的談話,在這裏。這是一個很好的總結,以及接受的答案:
我想我現在明白了。 messageQueue方法參數與對象的原始(this._messageQueue)引用無關。因此,檢查messageQueue爲null,並將其設置爲null,沒有好處。調用者仍然可以傳遞其變量(this._messageQueue),即使在處置之後。因此,能夠被處置多次。
順便說一下,即使在調用方法中將調用者的變量(this._messageQueue)設置爲null也沒有幫助。該問題僅在MsmqHelper.DisposeQueue()中存在。所以答案是通過ref傳遞,或者根本不要調用DisposeQueue()並在調用方法中完成所有操作。
**編輯2 **
嘗試此操作後,我得到相同的錯誤。我根本就沒有明白。
public static void DisposeQueue(ref MessageQueue messageQueue)
{
if (messageQueue == null) { return; }
messageQueue.Close();
messageQueue.Dispose();
messageQueue = null;
}
**編輯3 - 錯誤? **
我開始認爲這可能是一個錯誤。如果我評論messageQueue.Dispose(),錯誤消失。不過,我可以通過的方式調用messageQueue.Close()和messageQueue.Dispose()在中一起調用的方法。去搞清楚。我想我只是要從調用方法中調用這些相同的調用,或者只調用Close()或Dispose()而不是兩者。
其中定義了'public void Dispose()(bool disposing)'方法嗎? – Tigran 2012-03-20 21:14:35
這可能是因爲'Close'和'Dispose'做同樣的事情嗎? – 2012-03-20 21:24:23
@Lasse這是一個有趣的想法。我評論了Close()行並編譯了它。然後我取消註釋了Close()行,並對Dispose()行進行了註釋,並且它仍然被編譯。所以你所說的可能是答案。我可以發誓我在前面的代碼中都有兩行(Close()和Dispose()),並且它工作正常。我剛剛檢查過,而我做過。現在我不知道該怎麼想。 – 2012-03-20 21:29:56