SyncAsyncEventArgs.IsRunningSynchronously プロパティ
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
イベント ハンドラーが同期的に呼び出されたか非同期的に呼び出されたかを示す値を取得します。 詳細については、 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
適用対象
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
Azure SDK for .NET