等待Task.CompletedTask什么?

我使用在Build2017中引入的Windows Template Studio创建了UWP应用程序。

下面的类是它生成的代码的一部分。

public class SampleModelService { public async Task<IEnumerable> GetDataAsync() { await Task.CompletedTask; // <-- what is this for? var data = new List(); 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;的目的和原因是await Task.CompletedTask; 代码在这里? 它实际上没有Task结果接收器。

可能只是为了让以后的阶段更容易实现异步代码调用而不必更改签名,从而防止必须重构调用代码。

另一个选择是从方法签名和该行删除async关键字

 return Task.FromResult>(data); 

当您需要返回由于接口而等待的任务时,您会看到此构造,例如,当实现没有异步工作时。

但是,在这种情况下,由于它是一个模板,他们希望人们用await FetchDataFromDatabaseAsync();类的东西替换await Task.Completed await FetchDataFromDatabaseAsync(); 。 由于async关键字已经存在,因此可以最大限度地减少实现自己的异步调用所需的更改。

无论如何,没有这个等待构造你可以这样做:

 public class SampleModelService { public Task> GetDataAsync() { var data = new List(); 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>(data); } } 

如果根本不需要返回任务(您没有任何异步代码),那么只需将其完全删除即可。 (但是你必须重构调用这个方法的代码)

回顾一下这段代码我怀疑有人会在开发过程的后期调用异步方法,并且已经预料到通过指定此方法返回一个Task