Tôi có một tác vụ không đồng bộ ngắn sẽ thường xuyên bị hủy sau khi đã bắt đầu. Lớp "Task" có một chỉ báo IsCanceled mà tôi nghĩ sẽ thuận tiện khi sử dụng để chỉ ra rằng tác vụ async đã bị hủy mà không chạy đến khi hoàn thành, nhưng theo như tôi có thể nói cách duy nhất để có một tác vụ async được đánh dấu là hủy để ném một TaskCanceledException trong hàm async. Thường xuyên ném một ngoại lệ, để chỉ ra một tình huống xảy ra không bình thường, đi ngược lại cách tôi hiểu ngoại lệ nên được sử dụng. Có ai biết một cách tốt hơn để chỉ ra một nhiệm vụ không đồng bộ được hủy bỏ khi nó dự kiến sẽ xảy ra thường xuyên?C# async CTP - Làm thế nào để đánh dấu một tác vụ không đồng bộ như đã hủy mà không cần ném một TaskCanceledException?
tiếp theo tốt nhất thay thế của tôi là để trả về một cấu trúc có nó sở hữu IsCanceled riêng:
(Tôi đã bỏ qua một số mã hóa và phong cách thực hành tốt cho ngắn gọn ở đây)
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
}
Nhưng điều này dường như dư thừa và khó sử dụng hơn. Chưa kể nó giới thiệu các vấn đề nhất quán bởi vì sẽ có hai IsCanceled (một trong Task và một trong MightBeCanceled).
Ai đang hủy Foo? Nó chỉ có thể được hủy bởi người gọi, sử dụng một CancellationToken –