Mam krótkie zadanie asynchroniczne, które często trzeba będzie anulować po uruchomieniu. Klasa "Zadanie" ma wskaźnik IsCanceled, który, jak sądzę, byłby wygodny do użycia w celu wskazania, że zadanie asynchroniczne zostało anulowane bez uruchamiania do ukończenia, ale o ile mogę powiedzieć, jedynym sposobem na to, by zadanie asynchroniczne zostało oznaczone jako anulowane, jest rzucić wyjątek TaskCanceledException w funkcji asynchronicznej. Rzucanie wyjątku rutynowo, w celu wskazania sytuacji, która następuje nieświadomie, jest sprzeczne z tym, jak rozumiem, że należy stosować wyjątki. Czy ktokolwiek wie lepszy sposób wskazania zadania asynchronicznego, które ma zostać anulowane, gdy oczekuje się, że będzie się często zdarzało?C# async CTP - Jak oznaczyć zadanie asynchroniczne jako anulowane bez wywoływania wyjątku TaskCanceledException?
Moim następnym najlepszym rozwiązaniem jest, aby powrócić strukturę, która ma własną nieruchomość IsCanceled:
(mam ignorowane kilka dobrych kodowania i styl praktyki dla zwięzłości tutaj)
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
}
ale to wydaje zbędne i trudniejsze w użyciu. Nie wspominając o tym, że wprowadza problemy z konsekwencją, ponieważ będą dwa IsCanceled (jeden w zadaniu i jeden w MightBeCanceled).
Kto anuluje Foo? Powinien być dostępny do anulowania tylko przez osobę dzwoniącą za pomocą Token Anulowania –