Tengo un problema con el subprocesamiento múltiple en C#. Utilizo un evento para actualizar una etiqueta en un formulario de otro hilo, para lo cual necesito usar el comando Invoke() por supuesto. Esa parte también funciona bien. Sin embargo, el usuario puede cerrar el formulario y aquí el programa puede bloquearse si el evento se envía en un momento desafortunado.'Interbloqueo' con solo un objeto bloqueado?
Así que, pensé que simplemente anularía el método Dispose() del formulario, establecería un booleano en verdadero dentro del código bloqueado, y también verificaría ese booleano e invocaría el evento en código bloqueado.
Sin embargo, cada vez que cierro el formulario el programa se congela por completo.
Estas son las partes mencionadas del código:
private object dispose_lock = new object();
private bool _disposed = false;
private void update(object sender, EventArgs e)
{
if (InvokeRequired)
{
EventHandler handler = new EventHandler(update);
lock (dispose_lock)
{
if (_disposed) return;
Invoke(handler); // this is where it crashes without using the lock
}
return;
}
label.Text = "blah";
}
protected override void Dispose(bool disposing)
{
eventfullObject.OnUpdate -= update;
lock (dispose_lock) // this is where it seems to freeze
{
_disposed = true; // this is never called
}
base.Dispose(disposing);
}
espero que alguien aquí tiene alguna idea de lo que está mal con este código. ¡Gracias de antemano!
Podría una llamada de actualización en la aplicación real que la ventana de disponer? En ese caso, el hilo de fondo podría tener un bloqueo, y el hilo de la interfaz de usuario podría terminar en Deshacer el bloqueo en el mismo objeto que el hilo de fondo está reteniendo. –
Dónde obtiene la variable InvokeRequired, debe invocarse sobre el control que desea actualizar, es decir: if (label.InvokeRequired) {//} – Lloyd