知識マップ: C# async/await実務判断表 - Task.RunとConfigureAwait
記事「C# async/await実務判断表 - Task.RunとConfigureAwait」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
この記事は、C#のasync/awaitで最初に見るべきなのは処理がI/O-boundかCPU-boundかの区別であり、I/O待ちはasync APIをそのままawaitし、CPU計算はUIならTask.Run、ASP.NET Coreのリクエスト処理では避けるべきだと整理します。ConfigureAwait(false)はSynchronizationContextを持たないASP.NET Coreよりも、UIやアプリ固有コンテキストに依存しない汎用ライブラリコードで有力になります。独立した複数のI/O処理はTask.WhenAllやTask.WhenAnyで束ね、件数が多ければParallel.ForEachAsyncやSemaphoreSlimで並列数を制限し、寿命を呼び出し元から切り離したい処理はfire-and-forgetではなくChannel<T>とBackgroundServiceで管理すべきだとしています。
flowchart LR
accTitle: C# async/awaitの実務判断の知識マップ
accDescr: I/O-boundかCPU-boundかの見極めがTask.RunやConfigureAwait(false)の使い分け、WhenAll・WhenAny・Channelなどの選択とどうつながるかを示す図です。
io_bound_operation["I/O-bound処理"]
cpu_bound_operation["CPU-bound処理"]
taskrun_dotnet["Task.Run"]
ui_thread_context["UIスレッドのコンテキスト"]
asp_net_core_request_thread["ASP.NET Coreのリクエスト処理"]
sync_over_async["同期待ちの混入(sync-over-async)"]
threadpool_starvation["スレッドプール飢餓(starvation)"]
synchronizationcontext["SynchronizationContext"]
configureawait_false["ConfigureAwait(false)"]
generic_library_code["汎用ライブラリコード"]
cancellationtoken_dotnet["CancellationToken(.NET)"]
async_void["async void"]
event_handler_method["イベントハンドラメソッド"]
regular_async_method["通常の非同期メソッド"]
task_whenall["Task.WhenAll"]
task_whenany["Task.WhenAny"]
parallel_foreachasync["Parallel.ForEachAsync"]
semaphoreslim["SemaphoreSlim"]
channel_t["Channel<T>"]
backpressure["backpressure"]
backgroundservice["BackgroundService"]
ihostedservice["IHostedService"]
fire_and_forget["fire-and-forget"]
decoupled_background_work["呼び出し元から寿命を切り離した背景処理"]
periodictimer["PeriodicTimer"]
iasyncenumerable["IAsyncEnumerable<T>"]
await_using["await using"]
valuetask["ValueTask"]
taskrun_dotnet -->|"用いるのは非推奨"| io_bound_operation
taskrun_dotnet -->|"推奨される対応"| cpu_bound_operation
taskrun_dotnet -->|"推奨される対応"| ui_thread_context
taskrun_dotnet -->|"用いるのは非推奨"| asp_net_core_request_thread
sync_over_async -->|"原因になり得る"| threadpool_starvation
ui_thread_context -->|"利用する"| synchronizationcontext
configureawait_false -->|"推奨される対応"| generic_library_code
configureawait_false -->|"用いるのは非推奨"| ui_thread_context
io_bound_operation -.->|"利用する"| cancellationtoken_dotnet
async_void -->|"推奨される対応"| event_handler_method
async_void -->|"用いるのは非推奨"| regular_async_method
task_whenall -->|"推奨される対応"| io_bound_operation
task_whenany -.->|"利用する"| cancellationtoken_dotnet
parallel_foreachasync -->|"推奨される対応"| io_bound_operation
semaphoreslim -.->|"推奨される対応"| io_bound_operation
channel_t -.->|"利用する"| backpressure
backgroundservice -->|"推奨される対応"| channel_t
backgroundservice -->|"実装を担う"| ihostedservice
fire_and_forget -->|"用いるのは非推奨"| decoupled_background_work
channel_t -->|"推奨される対応"| decoupled_background_work
periodictimer -->|"利用する"| cancellationtoken_dotnet
iasyncenumerable -->|"推奨される対応"| io_bound_operation
await_using -.->|"前提とする"| io_bound_operation
valuetask -->|"用いるのは非推奨"| regular_async_method
event_handler_method -.->|"前提とする"| ui_thread_context
ihostedservice -->|"推奨される対応"| asp_net_core_request_thread
概念間の関係(全26件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- Task.RunをI/O-bound処理に用いることは推奨されません。
- Task.RunはCPU-bound処理に対する本記事の推奨です。
- Task.RunはUIスレッドのコンテキストに対する本記事の推奨です。
- Task.RunをASP.NET Coreのリクエスト処理に用いることは推奨されません。
- 同期待ちの混入(sync-over-async)はスレッドプール飢餓(starvation)の原因になることがあります。
- UIスレッドのコンテキストはSynchronizationContextを利用します。
- ConfigureAwait(false)は汎用ライブラリコードに対する本記事の推奨です。
- ConfigureAwait(false)をUIスレッドのコンテキストに用いることは推奨されません。
- I/O-bound処理はCancellationToken(.NET)を利用します。
- async voidはイベントハンドラメソッドに対する本記事の推奨です。
- async voidを通常の非同期メソッドに用いることは推奨されません。
- Task.WhenAllはI/O-bound処理に対する本記事の推奨です。
- Task.WhenAnyはCancellationToken(.NET)を利用します。
- Parallel.ForEachAsyncはI/O-bound処理に対する本記事の推奨です。
- SemaphoreSlimはI/O-bound処理に対する本記事の推奨です。
- Channel<T>はbackpressureを利用します。
- BackgroundServiceはChannel<T>に対する本記事の推奨です。
- BackgroundServiceはIHostedServiceの実装を担います。
- fire-and-forgetを呼び出し元から寿命を切り離した背景処理に用いることは推奨されません。
- Channel<T>は呼び出し元から寿命を切り離した背景処理に対する本記事の推奨です。
- PeriodicTimerはCancellationToken(.NET)を利用します。
- IAsyncEnumerable<T>はI/O-bound処理に対する本記事の推奨です。
- await usingはI/O-bound処理を前提とします。
- ValueTaskを通常の非同期メソッドに用いることは推奨されません。
- イベントハンドラメソッドはUIスレッドのコンテキストを前提とします。
- IHostedServiceはASP.NET Coreのリクエスト処理に対する本記事の推奨です。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。