жду задания.CompletedTask для чего?

Я создал приложение UWP с Windows Template Studio это введено в Build2017.

ниже класс является частью сгенерированного кода из него.

public class SampleModelService
{
    public async Task<IEnumerable<SampleModel>> GetDataAsync()
    {
        await Task.CompletedTask; // <-- what is this for?
        var data = new List<SampleModel>();

        data.Add(new SampleModel
        {
            Title = "Lorem ipsum dolor sit 1",
            Description = "Lorem ipsum dolor sit amet",
            Symbol = Symbol.Globe
        });

        data.Add(new SampleModel
        {
            Title = "Lorem ipsum dolor sit 2",
            Description = "Lorem ipsum dolor sit amet",
            Symbol = Symbol.MusicInfo
        });
        return data;
    }
}

мой вопрос в том, какова цель и причина await Task.CompletedTask; код здесь? Это на самом деле не имеет Task приемник результата от него.

1 ответов


вероятно, просто там, чтобы облегчить на более позднем этапе реализацию асинхронных вызовов кода без необходимости изменять подпись, предотвращая необходимость рефакторинга вызывающего кода.

другой вариант будет te удалить async ключевое слово из подписи метода и этой строки и do

return Task.FromResult<IEnumerable<SampleModel>>(data); 

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

в этом случае, однако, поскольку это шаблон, они ожидают, что люди заменят await Task.Completed что-то вроде await FetchDataFromDatabaseAsync();. С async ключевое слово уже есть, оно минимизирует необходимые изменения для реализации вашего собственного асинхронного вызова.

в любом случае, без этой конструкции ожидания вы можете сделать это:

public class SampleModelService
{
    public Task<IEnumerable<SampleModel>> GetDataAsync()
    {
        var data = new List<SampleModel>();

        data.Add(new SampleModel
        {
            Title = "Lorem ipsum dolor sit 1",
            Description = "Lorem ipsum dolor sit amet",
            Symbol = Symbol.Globe
        });

        data.Add(new SampleModel
        {
            Title = "Lorem ipsum dolor sit 2",
            Description = "Lorem ipsum dolor sit amet",
            Symbol = Symbol.MusicInfo
        });

        return Task.FromResult<IEnumerable<SampleModel>>(data); 
     }
}

если нет необходимости возвращать задачу вообще (у вас нет асинхронного кода), просто удалите ее полностью. (Но тогда вам придется рефакторить код что вызывает этот метод)

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