Виждал съм тази грешка в други публикации, но не и за тази точна ситуация.
Имам два класа, които правят едно и също нещо с 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() заедно в метода calling. Дайте сметка. Мисля, че просто ще направя същите тези извиквания от извикващите методи или ще извикам само Close() или Dispose() вместо и двете.
public void Dispose()(bool disposing)
метод? - person Tigran   schedule 21.03.2012Close
иDispose
правят едно и също нещо? - person Lasse V. Karlsen   schedule 21.03.2012