Должен ли метод, который получает задание и передает его, ждет его? - программирование

Должен ли метод, который получает задание и передает его, ждет его?

У меня есть два следующих метода:

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 или нет?

4b9b3361

Ответ 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;

? Опять же, я надеюсь, что вы сделаете первое. У вас есть последовательность в руке, так зачем идти на все проблемы с созданием новой последовательности, которая перечисляет старую?

То же самое касается задач; так же, как вы можете сделать делегата, который обертывает другой делегат и последовательность, которая обертывает другую последовательность, вы можете сделать задачу, которая завершает другую задачу, но зачем вам? Это просто пустая трата ресурсов.