Могу ли я безопасно удалить вызов await Task.CompletedTask в конце метода? - PullRequest
1 голос
/ 28 мая 2020

Я просматривал какой-то старый код и нашел метод async, выполняющий некоторые async вещи и в конце вызывающий await Task.CompletedTask;, как показано ниже:

    public async Task SomeMethod()
    {
        //some code
        //...

        await _someService.DoStuffAsync();
        await Task.CompletedTask;
    }

Из того, что я читал, кажется можно безопасно удалить последнюю строку, поскольку она не оказывает функционального влияния на выполнение метода, поскольку Task.CompletedTask вернет задачу, которая уже завершена, поэтому она не будет ждать ее, но у меня есть другие мысли по этому поводу.

Безопасно ли удалять последнюю строку? Это избыточно?

Ответы [ 2 ]

5 голосов
/ 28 мая 2020

Да, удалить это совершенно безопасно. Этот вызов не делает ничего, кроме проверки того, что задача уже выполнена.

Годы a go, когда async еще не было доступно, но Task было, нам нужно было

public Task Something()
{
    ....

    return Task.FromResult(0);
}

Люди приняли это, когда Task.CompletedTask был добавлен, и вы часто будете видеть

public Task Something()
{
    ....

    return Task.CompletedTask;
}

Это то, что имеет смысл, если .... ничего не делает asyn c, но вам все равно нужно вернуть Task.

Когда доступно async и тело метода await s, метод не должен ничего возвращать:

public async Task Something()
{
    await SomethingElse();        
}

Но await используя Task.CompletedTask - я не думаю, что есть сценарий, в котором это было бы полезно.

1 голос
/ 29 мая 2020

Добавление строки await Task.CompletedTask; - простой способ подавить предупреждение компилятора CS1998 :

В этом asyn c методе отсутствуют операторы 'await' и он будет выполняться синхронно . Рассмотрите возможность использования оператора await для ожидания неблокирующих вызовов API или await Task.Run (...) для выполнения работы с привязкой к ЦП в фоновом потоке.

Кроме этого это ничего не делает. Таким образом, вполне возможно добавить его при разработке API класса, а затем забыть удалить его после написания реализации. Не стесняйтесь удалить его. Удаление не вызовет никаких побочных эффектов.

...