Должен ли метод, который получает задание и передает его, ждет его?
У меня есть два следующих метода:
public async Task<bool> DoSomething(CancellationToken.token)
{
//do something async
}
//overload with None token
public /*async*/ Task<bool> DoSomething()
{
return /*await*/ DoSomething(CancellationToken.None);
}
Должен ли второй метод быть отмечен как ключевые слова async/wait или нет?
Ответы
Ответ 1
Это не нужно - если вы используете await/async во втором методе, вы добавите дополнительные накладные расходы, которые в этом случае ничего не добьются.
Асинхронная работа внутри DoSomething(CancellationToken)
уже обеспечит правильную асинхронную обработку и маршалинг обратно к существующему контексту для вас.
В конце дня async
и await
на самом деле являются просто языковыми функциями, которые упрощают создание и компоновку Task
. Если у вас уже есть отличный Task
, то нет необходимости использовать дополнительную поддержку языка для разворачивания и перезаписи в новый Task
.
Ответ 2
Чтобы добавить к Риду хороший ответ, подумайте об этом так:
Func<int, int> GetFunc()
{
Func<int, int> f = GetFunc(someParameter);
Если вы скажете
return f;
или причина "Я должен возвращать func здесь, так что давайте сделаем лямбду, которая вызывает функцию, которую я имею в руках":
return (int i) => f(i);
Надеюсь, вы сделаете первое; у вас уже есть Func<int, int>
в руке, поэтому просто верните его. Не делайте func, вызывающий func.
Если у вас
IEnumerable<int> GetSequence()
{
IEnumerable<int> sequence = GetSequence(someParameter);
ты скажешь
return sequence;
или
foreach(int item in sequence) yield return item;
? Опять же, я надеюсь, что вы сделаете первое. У вас есть последовательность в руке, так зачем идти на все проблемы с созданием новой последовательности, которая перечисляет старую?
То же самое касается задач; так же, как вы можете сделать делегата, который обертывает другой делегат и последовательность, которая обертывает другую последовательность, вы можете сделать задачу, которая завершает другую задачу, но зачем вам? Это просто пустая трата ресурсов.