CancellationToken
よりもこれの可能性が高い候補ですIProgress<T>
。を使用IProgress<T>
すると、多くの場合、レベルごとT
に異なります(高レベルのasync
メソッドは、低レベルのawait
呼び出しの進行状況通知を組み合わせます)。を使用CancellationToken
すると、ほとんどの場合、同じトークンが下位レベルのasync
メソッドに渡されます(キャンセルをサポートしていると想定)。CancellationToken
いくつかの非常に高度なコンビネータをサポートしていますが、ほとんど使用されていません。
主な欠点は、タスクベースの非同期パターンから逸脱することです。Microsoftまたはサードパーティのコードは明示的に取得することに注意する必要があります。つまり、最下位レベルのメソッドCancellationToken
で周囲のコンテキストから明示的にコードを引き出す必要があります。async
また、後でコードベースを保守するプログラマーは、TAPを期待する可能性があります。
実装を検討する際にも課題があります。メソッドがスレッドコンテキストを変更する場合でも、暗黙的にメソッドCancellationToken
の呼び出しに従う必要があります。async
つまり、次のことを考慮してください。メソッドの結果を待つ前にメソッドA
を呼び出します。あるスレッドから別のスレッドへの非同期実行コンテキストに従う必要があるため、単純なスレッドローカル静的プロパティを使用することはできません。ConfigureAwait(false)
B
これを行う方法(おそらくCallContext
クラスを使用しますか?)について読んだことを思い出しているようですが、それを実行するとすぐにパフォーマンスタンクになります(実行コンテキストの移行コードはデフォルトのシナリオ用に高度に最適化されています)。