Вариант 1:
Код: Выделить всё
Task Convert(Task input)
{
if (input is Task converted)
return converted;
Func converter = async () =>
{
await input;
return 0;
};
return converter();
}
Код: Выделить всё
Task Convert(Task input)
{
if (input is Task converted)
return converted;
return input.ContinueWith(_ => 0, TaskContinuationOptions.ExecuteSynchronously);
}
Я ищу ответ, который максимизирует совместимость. Это означает, помимо прочего:
- Если выдается входная задача, преобразованная задача выдает то же исключение с той же трассировкой стека ( т.е. нет ненужной переноски с AggregatedException, нет другой трассировки стека).
- Если задача ввода уже имеет какое-то устойчивое состояние (она уже завершена, неисправна и т. д.), тогда преобразованная задача должна иметь то же состояние.
- Я не хочу добавлять ненужные переключатели контекста. Это означает, например, что если задача ввода завершается в определенном потоке, преобразованная задача должна завершиться как можно скорее в том же потоке. Вот почему я добавил TaskContinuationOptions.ExecuteSynchronous к варианту 2, но я не уверен, правильно ли это/нужно.
- Библиотека может использовать ContinueWith, Подождите и т. д. Все, что будет работать, если входная задача уже введена, должно также работать и с преобразованной задачей. Также предположим, что библиотека может иметь зависимости от контекста синхронизации, контекста выполнения, планировщика задач и т. д.
Подробнее здесь: https://stackoverflow.com/questions/787 ... k-to-taskt