He visto este error en otras publicaciones, pero no para esta situación exacta.MessageQueue Disposed más de una vez
Tengo dos clases que hacen lo mismo con un MessageQueue. Por eso, resumí la creación y disposición de la cola a una clase de ayuda. Recibo este error y no veo cómo se puede eliminar la cola más de una vez.
Object 'MessageQueue' se puede disponer más de una vez en el método 'MsmqHelper.DisposeQueue (MessageQueue)'
En una de las clases, esto es cómo se utiliza la cola:
private MessageQueue _messageQueue;
Entonces , en el constructor de la clase:
this._messageQueue = MsmqHelper.InitializeQueue();
No es que realmente importa, sino por la totalidad, aquí es donde se utiliza la cola:
this._messageQueue.Send(workflowCreated);
Y aquí están los métodos Desechar:
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (disposing == false) { return; }
MsmqHelper.DisposeQueue(this._messageQueue);
}
Y este es el código de la clase de ayuda que realmente llama a Dispose():
public static void DisposeQueue(MessageQueue messageQueue)
{
if (messageQueue != null)
{
messageQueue.Close();
messageQueue.Dispose();
messageQueue = null;
}
}
Donde es posible que la cola para ser eliminado más de una vez en esta situación?
** Editar **
pensé que sería bueno añadir mis comentarios, en la conversación a continuación, aquí. Es un buen resumen, junto con la respuesta aceptada:
Creo que lo entiendo ahora. El parámetro del método messageQueue no tiene nada que ver con la referencia original (this._messageQueue) al objeto. Por lo tanto, consultar MessageQueue para null, y establecerlo en null, no sirve de nada. La persona que llama aún podría pasar su variable (this._messageQueue) incluso después de haber sido eliminada. Por lo tanto, puede ser eliminado más de una vez.
Por cierto, incluso establecer la variable de la persona que llama (this._messageQueue) a null, en el método de llamada, no ayuda. El problema existe únicamente en MsmqHelper.DisposeQueue(). Entonces la respuesta es pasar por ref o simplemente no llamar a DisposeQueue() y hacerlo todo en el método de llamada.
** Editar ** 2
Después de probar esto, me sale el mismo error. Simplemente no lo entiendo
public static void DisposeQueue(ref MessageQueue messageQueue)
{
if (messageQueue == null) { return; }
messageQueue.Close();
messageQueue.Dispose();
messageQueue = null;
}
** Editar 3 - Bug? **
Estoy empezando a pensar que esto puede ser un error. Si digo messageQueue.Dispose(), el error desaparece. SIN EMBARGO, I puede llame a messageQueue.Close() y messageQueue.Dispose() juntos en el llamando al método. Imagínate. Creo que voy a hacer estas mismas llamadas desde los métodos de llamada, o solo llamar a Close() o Dispose() en lugar de a ambos.
donde se define 'public void Dispose() (bool disposing)' method? – Tigran
¿Podría ser posible porque 'Close' y' Dispose' hacen lo mismo? –
@Lasse Esa es una idea interesante. Comenté la línea Close() y compilé. Luego descommenté la línea Close() y comenté la línea Dispose() y aún compilé. Entonces, lo que dijiste podría ser la respuesta. Podría haber jurado que tenía ambas líneas (Cerrar() y Deshacer()) en el código anterior y funcionó. Acabo de comprobar, y lo hice. Ahora no estoy seguro de qué pensar. –