Compartir a través de


SyncAsyncEventArgs.IsRunningSynchronously Propiedad

Definición

Obtiene un valor que indica si el controlador de eventos se invocó de forma sincrónica o asincrónica. Consulte SyncAsyncEventHandler<T> para más información.

public bool IsRunningSynchronously { get; }
member this.IsRunningSynchronously : bool
Public ReadOnly Property IsRunningSynchronously As Boolean

Valor de propiedad

Comentarios

El mismo SyncAsyncEventHandler<T> evento se puede generar desde rutas de acceso de código sincrónicas y asincrónicas en función de si se llama a métodos sincrónicos o asincrónicos en un cliente. Si escribe un controlador asincrónico pero lo genera a partir de un método de sincronización, el controlador realizará la sincronización sobreasync y puede provocar el colapso de ThreadPool. Consulte Diagnóstico del hambre de ThreadPool de .NET Core con PerfView para obtener una explicación detallada de cómo puede causar el colapso de ThreadPool y problemas graves de rendimiento.

Puede usar esta IsRunningSynchronously propiedad para comprobar cómo se genera el evento e implementar el controlador en consecuencia. Este es un controlador de ejemplo que es seguro invocar desde rutas de acceso de código sincronizadas y asincrónicas.

var client = new AlarmClient();
client.Ring += async (SyncAsyncEventArgs e) =>
{
    if (e.IsRunningSynchronously)
    {
        Console.WriteLine("Wake up!");
    }
    else
    {
        await Console.Out.WriteLineAsync("Wake up!");
    }
};

client.Snooze(); // sync call that blocks
await client.SnoozeAsync(); // async call that doesn't block

Se aplica a