Как правильно преобразовать Task в Task?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно преобразовать Task в Task?

Сообщение Anonymous »

Я использую библиотеку, которая принимает Task, но иногда мне приходится передавать только Task, который мне нужно преобразовать в Task. Какой вариант преобразования задачи будет более эффективным/рекомендуемым?
Вариант 1:

Код: Выделить всё

Task Convert(Task input)
{
if (input is Task converted)
return converted;

Func converter = async () =>
{
await input;
return 0;
};

return converter();
}
Вариант 2:

Код: Выделить всё

Task Convert(Task input)
{
if (input is Task converted)
return converted;

return input.ContinueWith(_ => 0, TaskContinuationOptions.ExecuteSynchronously);
}
Может быть, какой-нибудь вариант 3?
Я ищу ответ, который максимизирует совместимость. Это означает, помимо прочего:
  • Если выдается входная задача, преобразованная задача выдает то же исключение с той же трассировкой стека ( т.е. нет ненужной переноски с AggregatedException, нет другой трассировки стека).
  • Если задача ввода уже имеет какое-то устойчивое состояние (она уже завершена, неисправна и т. д.), тогда преобразованная задача должна иметь то же состояние.
  • Я не хочу добавлять ненужные переключатели контекста. Это означает, например, что если задача ввода завершается в определенном потоке, преобразованная задача должна завершиться как можно скорее в том же потоке. Вот почему я добавил TaskContinuationOptions.ExecuteSynchronous к варианту 2, но я не уверен, правильно ли это/нужно.
  • Библиотека может использовать ContinueWith, Подождите и т. д. Все, что будет работать, если входная задача уже введена, должно также работать и с преобразованной задачей. Также предположим, что библиотека может иметь зависимости от контекста синхронизации, контекста выполнения, планировщика задач и т. д.


Подробнее здесь: https://stackoverflow.com/questions/787 ... k-to-taskt
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»