Является ли перехват TaskCanceledException и проверка Task.Canceled хорошей идеей?

В моей команде есть люди, которые действительно любят программировать с помощью asyncTask, И иногда они любят использоватьCancellationToken параметры.

Что я не уверен, так это то, должны ли мы как команда использовать этот стиль кода (A):

async Task<someObject> DoStuff(CancellationToken t)
{
    while (!t.IsCanceled)
    {
        try {
            Task.Delay(5000, t);
        }
        catch (AggregateException e) // or is it TaskCanceledException or OperationCanceledException? I don't know? :)
        {
        }
        // poll something, return someObject, or null
    }
    return null;
}

Это, очевидно, означает, что вызывающая сторона, вероятно, должна сама проверить токен отмены, чтобы определить, следует ли продолжить обработку, и им, возможно, придется обрабатывать нулевые ретвалы:

var retVal = await DoStuff(token);
if (token.IsCanceled) { ... }

Однако, если мы примем второй стиль кода (B), который опирается на TaskCanceledException:

async Task<someObject> DoStuff(CancellationToken t)
{
    while(true)
    {
        Task.Delay(5000, t);
        // poll something, return someObject, or null
    }
}

Код реализации определенно проще - и у вызывающей стороны есть возможность обрабатывать исключение или нет, в зависимости от ситуации ... но я не могу не беспокоиться о том, что вызывающие могутзабывать что TaskCanceledException - это то, о чем они должны беспокоиться, и процессы могут аварийно завершить работу в результате того, что они не перехватят эти исключения (на переднем плане или в фоновых потоках).

Итак, мой чрезмерно оптимистичный вопрос: как вы думаете,Лучший стиль, которыйкаждый долженвсегда использовать, а почему? :)

Ответы на вопрос(1)

Ваш ответ на вопрос