非同期操作をキャンセルします
-
26-10-2019 - |
質問
プロトコルスタックを実装するクラスライブラリを開発しています。そこには、iasyncresultを実装する非同期操作があります。この方法のユーザーは、begindosomhingeとenddosomhinteを使用できます。とても長い間、それは非常に一般的な作業です。
今、私は非同期操作を中止するための要件を得ました。私はこれを達成するためのいくつかの方法を考えることができますが、どれが最高かどうかはわかりません:
- begindosomhintsとenddosomhing以外に、canceldosomineの方法を持っています。これは一般的なASAYNCパターンではないため、操作のユーザーを見つけるのは簡単ではありません。
- いいえによると1:キャンセルプロパティを持っています
- BegindosomThingによって返されるIasyncresultのインスタンスは、dosomethingasyncresultに投げかけることができます。 DosomethingAsyncresultにはキャンセルメソッドがあります。繰り返しますが、これは非同期パターンの一般的な使用法ではなく、クラスライブラリの「共通ユーザー」を知ることはほとんどありません。
- いいえによると3:キャンセルプロパティを持っています
- begindosomethingによって返されるiasyncresultのインスタンスは、iabortableasyncresultを実装しています。
public IAbortableAsyncResult:IAsyncResult { void Abort(); }
. 。私にとって、これは最もエレガントな方法のようです。ユーザーがbegindosomhingsを使用して操作を開始すると、iabortableasyncresultのインスタンスを取得します。これは、この特別な機能が彼に顕著に紹介されることを意味します。
最良の解決策は何ですか?これを解決する方法はさらにありますか?私はノーが好きです。 5コードの匂いがないため(少なくとも今まで認識していませんでした)。
編集
TPL/.NET 4に依存していないアプローチは、.NETフレームワークの最新バージョンに移植できないレガシーコードにも適用できるソリューションを持っていることを認識されています。
/編集
解決
CancellationTokenおよびCancellationTokenSourceが4.0で.NETに追加され、それ以来共通のキャンセルパターンの基礎を形成しました。一般に、非同期の方法には過負荷があり、キャンセルがかかります。
CancellationTokensの消費者は、トークンがキャンセルされたときにコールバックに登録し、コールバックを使用して実行を停止できます。あるいは、タスクが特に長期にわたって実行されていない場合、イスカンセルされたプロパティは断続的に投票することができます。
CancellationTokenは非同期タスクで使用されるインターフェイスであり、タスクのイニシエーターはCancellationTokenSourceを使用してこのトークンを発行し、将来キャンセルする可能性があります。
このアプローチについての素晴らしいことの1つは、キャンセルにアプローチする標準的な方法になる以外に、構成可能であることです。タスクが他のいくつかのキャンセル可能な非同期操作を構成する場合、同じキャンセルトークンをそれらに渡すことができ、キャンセルは自動的に動作するはずです。