我有一個短暫的異步任務,經常需要在啓動後取消。 「Task」類有一個IsCanceled指示器,我認爲它可以方便地用來指示異步任務被取消而不運行到完成,但是據我所知,唯一的方法是將異步任務標記爲取消在異步函數中拋出TaskCanceledException。常規拋出例外情況,以表明無意中出現的情況,違背了我應該如何理解例外情況。有沒有人知道一個更好的方式來表明一個異步任務被取消,當它預計會頻繁發生?C#async CTP - 如何將異步任務標記爲取消而不拋出TaskCanceledException?
我的下一個最佳選擇是返回擁有它自己的IsCanceled屬性的結構:
(我忽略了簡潔這裏一些好的編碼和風情習俗)
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(一個在Task中,一個在MightBeCanceled中)。
誰取消Foo?它只能由調用者使用CancellationToken取消 –