Compartilhar via


SyncAsyncEventArgs.IsRunningSynchronously Propriedade

Definição

Obtém um valor que indica se o manipulador de eventos foi invocado de forma síncrona ou assíncrona. Confira SyncAsyncEventHandler<T> para obter mais detalhes.

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

Valor da propriedade

Comentários

O mesmo SyncAsyncEventHandler<T> evento pode ser gerado de caminhos de código síncronos e assíncronos, dependendo se você está chamando métodos de sincronização ou assíncronos em um cliente. Se você escrever um manipulador assíncrono, mas elevá-lo de um método de sincronização, o manipulador fará a sincronização sobre assíncrona e poderá causar a falta de threadpool. Consulte Diagnosticing .NET Core ThreadPool Starvation with PerfView para obter uma explicação detalhada de como isso pode causar problemas graves de desempenho e fome do ThreadPool.

Você pode usar essa IsRunningSynchronously propriedade para marcar como o evento está sendo gerado e implementar seu manipulador adequadamente. Aqui está um manipulador de exemplo que é seguro para invocar de caminhos de código assíncronos e de sincronização.

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

Aplica-se a