He notado una nueva tendencia en .NET 4.0, específicamente en escenarios potencialmente multiproceso, que es evitar eventos y proporcionar métodos de suscriptor.Método de suscriptor vs evento
Por ejemplo, System.Threading.Tasks.Task y Task<TResult>
tienen ContinueWith() métodos en lugar de un evento Completado o Finalizado. Otro ejemplo es System.Threading.CancellationToken: tiene un método Register() en lugar de un evento CancellationRequested.
Mientras Task.ContinueWith() es lógico, ya que permite una fácil encadenamiento de tareas (no sería tan elegante, con eventos), y que también permite Task<TResult>
heredar de Task
(porque de esta manera, puede proporcionar Task<TResult>
sobrecargas apropiadas, que no sería posible para un evento: si tiene un evento EventHandler Finalizado en Tarea, todo lo que puede hacer es crear otro evento, decir, evento terminado en Task<TResult>
, que no es muy bueno), pero no puedo encontrar el misma explicación para CancellationToken.Register().
Entonces, ¿cuáles son las desventajas de los eventos en escenarios similares? ¿Debo seguir también este patrón? Para aclarar, ¿cuál de los siguientes debería elegir? ¿Cuándo debería preferir uno contra el otro?
public event EventHandler Finished;
// or
public IDisposable OnFinished(Action continuation)
Muchas gracias!
@Jon Skeet: gracias, no me di cuenta de que mis corchetes ángel necesitaban escapar. – ShdNx
Los eventos de interfaz de usuario, etc. se pueden publicar utilizando la cola de mensajes de la interfaz de usuario y pueden ser realmente lentos/pesados en comparación con el uso de un delegado o una tarea simple. – CodingBarfield
@Barfieldmv: La llamada de acción podría publicarse utilizando la misma técnica con Invoke/BeginInvoke al Hilo de interfaz de usuario. No es la diferencia. –