Como han señalado otros, esto es completamente sincrónico. Si quisiera ejecutar esto de forma asíncrona, tendría que escribir esto de manera diferente.
Además, si el evento 'onA' no está suscrito, onA() generará una excepción de referencia nula.
El patrón habitual es definir un evento 'Foo' y un método 'OnFoo' al que llama cuando se produce el evento. Desde el nombre del evento Sospecho que esto es lo que deseo - por ejemplo: -
class Foo // Class and member names must be distinct
{
public delegate void ADelegate();
public event ADelegate A;
private void OnA()
{
if(A != null)
A();
}
public void Func()
{
// Some code...
OnA();
// More code...
}
}
Si desea llamar a los controladores de eventos suscritos de forma asíncrona puede utilizar BeginInvoke() y EndInvoke() así: -
class Foo // Class and member names must be distinct
{
public delegate void ADelegate();
public event ADelegate A;
private void OnA()
{
if (A == null) return;
// There may be multiple subscribers, invoke each separately.
foreach(ADelegate del in A.GetInvocationList())
del.BeginInvoke(SubscriberCallback, del);
}
private void SubscriberCallback(IAsyncResult result)
{
var del = (ADelegate) result.AsyncState;
del.EndInvoke(result);
// Do something in the callback...
}
public void Func()
{
// Some code...
OnA();
// More code...
}
}
Tenga en cuenta que este código no espera esperar para terminar la ejecución de los suscriptores del evento, tendrías que pasar el resultado asincrónico a través de la llamada al evento para garantizar que esto ocurra.
Tenga en cuenta que la 'devolución de llamada' es el método que especifica en BeginInvoke asincrónico (ya que se 'vuelve a llamar' una vez que se realiza el trabajo asincrónico) y no regresa a Func() ya que se ejecuta en hilo separado
Muchas gracias. Eso es lo que esperaba. Lo probará usando el depurador como sugirió. – user642770