Является ли перехват 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 - это то, о чем они должны беспокоиться, и процессы могут аварийно завершить работу в результате того, что они не перехватят эти исключения (на переднем плане или в фоновых потоках).
Итак, мой чрезмерно оптимистичный вопрос: как вы думаете,Лучший стиль, которыйкаждый долженвсегда использовать, а почему? :)