C # async CTP - Как пометить асинхронную задачу как отмененную, не генерируя TaskCanceledException?

У меня есть короткая асинхронная задача, которую часто нужно будет отменять после ее запуска. В классе «Task» есть индикатор 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).

6
задан Mike 11 August 2011 в 20:36
поделиться