このエラーは他の投稿では見られましたが、このような状況では発生しませんでした。MessageQueueが1回以上廃棄されました
私は、MessageQueueで同じことをする2つのクラスを持っています。そのため、私はキューの作成と処分をヘルパークラスに抽象化しました。私はこのエラーが発生している、と私はキューが複数回配置することができないのか分かりません。
オブジェクトは「メッセージキュー「MsmqHelper.DisposeQueue(メッセージキュー)」メソッドに複数回配置することができる
クラスのいずれかで、このキューを使用する方法である:
そして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;
}
}
この状況で2回以上処分されるのでしょうか?
**編集**
は、私はここで、以下の会話の中で、私のコメントを追加するにはいいだろうと思いました。それは受け入れられた答えと一緒に良い要約です:
私は今それを得ると思います。 messageQueueメソッドのパラメータは、オブジェクトへの元の参照(this._messageQueue)とは関係ありません。だから、nullのmessageQueueをチェックし、それをヌルに設定するといいことはありません。呼び出し側は、その変数(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()をコメントすると、エラーは消え去ります。ただし、を呼び出してQQueue.Close()とmessageQueue.Dispose()を呼び出す方法は、メソッドを呼び出してください。 Go figure。私は、呼び出しメソッドからこれらの同じ呼び出しを行うか、または両方の代わりにClose()またはDispose()を呼び出すだけであると思います。
ここで、 'public void Dispose()(bool disposing)'メソッドが定義されていますか? – Tigran
'Close'と' Dispose'が同じことをする可能性がありますか? –
@Lasseそれは興味深い考えです。私はClose()行にコメントし、コンパイルしました。それから、私はClose()行のコメントを外し、Dispose()行をコメントして、まだコンパイルしました。あなたが言ったことが答えかもしれません。私は前のコードで両方の行(Close()とDispose())を持っていたと誓っていました。私はちょうどチェックし、私はしました。今私は何を考えるべきか分からない。 –