Freigeben über


SyncAsyncEventArgs.IsRunningSynchronously Eigenschaft

Definition

Ruft einen Wert ab, der angibt, ob der Ereignishandler synchron oder asynchron aufgerufen wurde. Ausführliche Informationen finden Sie unter SyncAsyncEventHandler<T>.

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

Eigenschaftswert

Hinweise

Dasselbe SyncAsyncEventHandler<T> Ereignis kann sowohl über synchrone als auch über asynchrone Codepfade ausgelöst werden, je nachdem, ob Sie Synchronisierungs- oder asynchrone Methoden auf einem Client aufrufen. Wenn Sie einen asynchronen Handler schreiben, ihn aber aus einer Synchronisierungsmethode auslösen, führt der Handler sync-over-async aus und kann threadPool-Verhungern verursachen. Unter Diagnostizieren von .NET Core ThreadPool Starvation mit PerfView finden Sie eine ausführliche Erläuterung, wie dies zu ThreadPool-Aushungern und schwerwiegenden Leistungsproblemen führen kann.

Sie können diese IsRunningSynchronously Eigenschaft verwenden, um zu überprüfen, wie das Ereignis ausgelöst wird, und ihren Handler entsprechend implementieren. Hier sehen Sie einen Beispielhandler, der sicher sowohl von Synchronisierungs- als auch von asynchronen Codepfaden aufgerufen werden kann.

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

Gilt für: