C# 等待任务。完成任务的原因是什么?

C# 等待任务。完成任务的原因是什么?,c#,uwp,async-await,task,windows-10-universal,C#,Uwp,Async Await,Task,Windows 10 Universal,我创建了UWP应用程序,并在Build2017中引入了该应用程序 下面的类是从它生成的代码的一部分 public class SampleModelService { public async Task<IEnumerable<SampleModel>> GetDataAsync() { await Task.CompletedTask; // <-- what is this for? var data = new

我创建了UWP应用程序,并在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;
    }
}
公共类SampleModelService
{
公共异步任务GetDataAsync()
{

wait Task.CompletedTask;//它的存在是为了使后期更容易实现异步代码调用,而无需更改签名,从而防止重构调用代码

虽然搭建的示例代码是同步的,但TemplateStudio是专门围绕异步数据访问层设计的,您需要通过修改生成方法的主体来实现自己的数据访问

如果没有实现异步实现,整个模板化应用程序的代码将发生重大变化,对于新开发人员来说,这将是一个非常陡峭的学习曲线,模板的要点是以最少的努力甚至经验启动并运行

另一个选项是从方法签名和该行中删除
async
关键字并执行

return Task.FromResult<IEnumerable<SampleModel>>(data); 
如果根本不需要返回任务(您没有任何异步代码),那么只需将其完全删除即可。(但是,您必须重构调用此方法的代码)


回顾这段代码,我怀疑有人会在开发过程的后期调用异步方法,并且已经预料到,通过指定此方法返回一个
任务
等待任务。CompletedTask可以像第一个答案所说的那样更容易实现此方法,因为此实现不是time-consuming,从而“wait Task.CompletedTask”或“return Task.FromResult(data)”两者都将同步运行。您可以使用上面提到的这两种模式,但此方法被设计为异步方法,因此当您的实现非常耗时但没有任何异步代码时,请使用Task.run创建一个任务。

所以我们可以说,它是
async
签名的一种占位符。它是吗ht?好吧,每当你
等待
某件事时,你都需要在方法签名中添加
async
。要更深入地解释为什么需要
async
关键字,请阅读这篇文章:。在这种特殊情况下,这是添加
async
关键字的理由。因为这是他们使用的模板t让人们替换
等待任务。已完成的
类似于
等待从数据库获取数据异步();
返回任务。运行(()=>{xx})?使用者对异常处理语义是否有期望?如果代码抛出异常会发生什么?通常它应该返回一个有故障的任务,但在这种情况下不会;异常会冒泡出来。@rory.ap correct,以减少捕获异常并返回
task.FromException(异常)的可能性;
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); 
     }
}