次の方法で共有


SyncAsyncEventArgs.IsRunningSynchronously プロパティ

定義

イベント ハンドラーが同期的に呼び出されたか非同期的に呼び出されたかを示す値を取得します。 詳細については、 SyncAsyncEventHandler<T> を参照してください。

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

プロパティ値

注釈

クライアントで同期メソッドと非同期メソッドのどちらを呼び出しているかに応じて、同期コード パスと非同期コード パスの両方から同じ SyncAsyncEventHandler<T> イベントを発生させることができます。 非同期ハンドラーを記述し、同期メソッドから発生させる場合、ハンドラーは sync-over-async を実行し、ThreadPool の枯渇を引き起こす可能性があります。 ThreadPool の枯渇と重大なパフォーマンスの問題の原因の詳細については、「 PerfView を使用した .NET Core ThreadPool Starvation の診断 」を参照してください。

このIsRunningSynchronouslyプロパティを使用して、イベントの発生方法をチェックし、それに応じてハンドラーを実装できます。 同期と非同期の両方のコード パスから呼び出しても安全なハンドラーの例を次に示します。

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

適用対象