我有一个简短的异步任务,它开始后经常需要取消。“任务”类有一个 IsCanceled 指示器,我认为可以方便地使用它来指示异步任务在没有运行完成的情况下被取消,但据我所知,将异步任务标记为已取消的唯一方法是在异步函数中抛出 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 中)。