Я видел эту ошибку в других сообщениях, но не в этой конкретной ситуации.
У меня есть два класса, которые делают то же самое с MessageQueue. Из-за этого я абстрагировал создание и удаление очереди вспомогательным классом. Я получаю эту ошибку и не понимаю, как очередь может быть удалена более одного раза.
Объект «messageQueue» может быть удален более одного раза в методе «MsmqHelper.DisposeQueue (MessageQueue)»
В одном из классов очередь используется так:
private MessageQueue _messageQueue;
Затем в конструкторе класса:
this._messageQueue = MsmqHelper.InitializeQueue();
Не то, чтобы это действительно имело значение, но для полноты здесь используется очередь:
this._messageQueue.Send(workflowCreated);
А вот методы Dispose:
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() вместе в методе calling. Иди разберись. Я думаю, что я просто буду делать те же самые вызовы из вызывающих методов или вызывать только Close() или Dispose() вместо обоих.
public void Dispose()(bool disposing)
? - person Tigran   schedule 21.03.2012Close
иDispose
делают одно и то же? - person Lasse V. Karlsen   schedule 21.03.2012