Я использую библиотеку, которая принимает Task, но иногда мне приходится передавать только Task, который мне нужно преобразовать в Task. Какой вариант преобразования задачи будет более эффективным/рекомендуемым?
Вариант 1:
Task Convert(Task input)
{
if (input is Task converted)
return converted;
return input.ContinueWith(_ => 0, TaskContinuationOptions.ExecuteSynchronously);
}
Может быть, какой-нибудь вариант 3?
Я ищу ответ, который максимизирует совместимость. Это означает, помимо прочего:
Если выдается входная задача, преобразованная задача выдает то же исключение с той же трассировкой стека ( т.е. нет ненужной переноски с AggregatedException, нет другой трассировки стека).
Если задача ввода уже имеет какое-то устойчивое состояние (она уже завершена, неисправна и т. д.), тогда преобразованная задача должна иметь то же состояние.
Я не хочу добавлять ненужные переключатели контекста. Это означает, например, что если задача ввода завершается в определенном потоке, преобразованная задача должна завершиться как можно скорее в том же потоке. Вот почему я добавил TaskContinuationOptions.ExecuteSynchronous к варианту 2, но я не уверен, правильно ли это/нужно.
Библиотека может использовать ContinueWith, Подождите и т. д. Все, что будет работать, если входная задача уже введена, должно также работать и с преобразованной задачей. Также предположим, что библиотека может иметь зависимости от контекста синхронизации, контекста выполнения, планировщика задач и т. д.
Я использую библиотеку, которая принимает Task, но иногда мне приходится передавать только Task, который мне нужно преобразовать в Task. Какой вариант преобразования задачи будет более эффективным/рекомендуемым? Вариант 1: [code]Task Convert(Task input) { if (input is Task converted) return converted;
return converter(); } [/code] Вариант 2: [code]Task Convert(Task input) { if (input is Task converted) return converted;
return input.ContinueWith(_ => 0, TaskContinuationOptions.ExecuteSynchronously); } [/code] Может быть, какой-нибудь вариант 3? Я ищу ответ, который максимизирует совместимость. Это означает, помимо прочего: [list] [*]Если выдается входная задача, преобразованная задача выдает то же исключение с той же трассировкой стека ( т.е. нет ненужной переноски с AggregatedException, нет другой трассировки стека). [*]Если задача ввода уже имеет какое-то устойчивое состояние (она уже завершена, неисправна и т. д.), тогда преобразованная задача должна иметь то же состояние. [*]Я не хочу добавлять ненужные переключатели контекста. Это означает, например, что если задача ввода завершается в определенном потоке, преобразованная задача должна завершиться как можно скорее в том же потоке. Вот почему я добавил TaskContinuationOptions.ExecuteSynchronous к варианту 2, но я не уверен, правильно ли это/нужно. [*]Библиотека может использовать ContinueWith, Подождите и т. д. Все, что будет работать, если входная задача уже введена, должно также работать и с преобразованной задачей. Также предположим, что библиотека может иметь зависимости от контекста синхронизации, контекста выполнения, планировщика задач и т. д. [/list]