私は、開始後に頻繁にキャンセルする必要のある短い非同期タスクを持っています。 "タスク"クラスには、IsCanceledインジケータがあり、非同期タスクが完了するまでにキャンセルされたことを示すのに便利だと思いますが、非同期タスクをキャンセル済みとしてマークする唯一の方法はわかりますasync関数にTaskCanceledExceptionをスローします。例外的に例外をスローすると、例外的に発生する状況を示すために、例外が使用されるべきであると理解する方法に反します。頻繁に起こることが予想されるときに非同期タスクをキャンセルすることを示す良い方法を誰かが知っていますか? C#async CTP - 非同期タスクをキャンセルしたとしてマークするには、TaskCanceledExceptionをスローしないでください。
がclass MightBeCanceled<T>
{
public readonly T Value;
public readonly bool IsCanceled;
public MightBeCanceled(T value) { Value = value; IsCanceled = false; }
public static MightBeCanceled<T> Canceled = new MightBeCanceled<T>(default(T), true);
private MightBeCanceled(T value, bool isCanceled) { Value = value; IsCanceled = isCanceled; }
}
...
static async Task<MightBeCanceled<int>> Foo()
{
if (someCancellationCondition)
return MightBeCanceled<int>.Canceled;
else
return new MightBeCanceled<int>(42);
}
static async void Bar()
{
var mightBeCanceled = await Foo();
if (mightBeCanceled.IsCanceled)
; // Take canceled action
else
; // Take normal action
}
しかし、これはそう(私はいくつかの良いコーディングとスタイルここでは簡潔にするためプラクティスを無視してきました):
私の次善の選択肢は、それが自分のIsCanceled財産のしている構造を返すことです冗長で使いにくい言うまでもなく、IsCanceledが2つ(タスクに1つ、MightBeCanceledに1つ)あるため、整合性の問題が発生します。
誰がFooをキャンセルしていますか?それは、CancellationTokenを使用して、呼び出し元によってのみ取り消すことができます。 –