Tengo el siguiente manejador de sucesos:invocación de un manejador de sucesos
private EventHandler<MyEventArgs> _myEventHandler;
public event EventHandler<MyEventArgs> MyEvent
{
add { _myEventHandler += value; }
remove { _myEventHandler -= value; }
}
Podría alguien explicar la diferencia entre los siguientes fragmentos?
fragmentos manejador de sucesos (A):
//Snippet A:
if (_myEventHandler != null)
{
_myEventHandler(new MyEventArgs());
}
fragmentos BeginInvoke (B):
//Snippet B:
if (_myEventHandler != null)
{
_myEventHandler.BeginInvoke(new MyEventArgs(), ar =>
{
var del = (EventHandler<MyEventArgs>)ar.AsyncState;
del.EndInvoke(ar);
}, _myEventHandler);
}
Para mayor claridad: ¿Cuál es la diferencia entre la invocación de un manejador de sucesos "tal como es" y el uso de BeginInvoke
?
No se requiere necesariamente un hilo diferente, ¿verdad? Llamar a un delegado de forma asincrónica todavía se realiza en el mismo hilo, pero regresa en el momento en que bloquea AFAIK. –
@Jeff no; llamar a un delegado asincrónicamente significa que ocurre en un hilo de trabajo. ¿De qué otra forma se ejecutaría de forma asíncrona? Tenga en cuenta que esto es sutilmente diferente de Control.BeginInvoke, que * podría * continuar en el mismo subproceso si ya está en el subproceso UI –
Si el delegado al que se llama realiza el control IO (es decir, bloques) se devuelve al sitio de llamada. Cuando eso se completa, el hilo original se interrumpe para terminar el resto del método. Tal como lo entendí, no se crean nuevos hilos, todo es interrupciones a partir de ahí. –