Я видел эту ошибку на других постах, но не для этой конкретной ситуации.
У меня есть два класса, которые делают то же самое с 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 - Ошибка? **
Я начинаю думать, что это может быть ошибкой. Если я прокомментирую сообщение Queue.Dispose (), ошибка исчезнет. ОДНАКО я могу вызвать messageQueue.Close () и messageQueue.Dispose () вместе в , вызывая метод. Пойди разберись. Я думаю, что я просто собираюсь сделать те же самые вызовы из вызывающих методов, или только вызвать Close () или Dispose () вместо обоих.