He aquí un ejemplo:¿Cómo lidiar con las condiciones de carrera en multi-threading?
if (control.InvokeRequired)
{
control.BeginInvoke(action, control);
}
else
{
action(control);
}
¿Y si entre el estado y la BeginInvoke llamar el control está dispuesta, por ejemplo?
Otro ejemplo que tiene que ver con los acontecimientos:
var handler = MyEvent;
if (handler != null)
{
handler.BeginInvoke(null, EventArgs.Empty, null, null);
}
Si MyEvent
es dado de baja entre la primera línea y la sentencia if, si el todavía será ejecutado comunicado. Sin embargo, ¿es ese diseño apropiado? ¿Qué pasa si con la desuscripción también se produce la destrucción del estado necesaria para la invocación adecuada del evento? Esta solución no solo tiene más líneas de código (repetitivo), sino que no es tan intuitiva y puede generar resultados inesperados para el cliente.
¿Qué dices, SO?
la razón por la que existe el patrón descrito anteriormente para controladores de eventos es mantener viva una referencia al controlador para que no se pueda eliminar. –
@Mitch Wheat: Sí, no estoy diciendo que el controlador necesariamente se elimine, pero que si el cliente cancela la suscripción del evento, también puede decidir que ya no necesita algún tipo de objeto de estado que normalmente solo utiliza el controlador de eventos. Debido a que el evento aún se ejecuta después de anular la suscripción con un momento desafortunado, puede haber un error muy difícil de rastrear porque el resultado esperado fue que el controlador no se ejecutará después de anular la suscripción. –
@Mitch Vea mi respuesta. –