2015-10-16 126 views
2

这是为什么工作的返回值?返回类型不是任务。为什么是“异步任务”的方法不是任务

public async Task<WorkItem> CreateWorkItem(WorkItem workItem) 
{ 
    WorkItem item = new WorkItem(); 
    workItem.Description = "something"; 
    item = await Task.FromResult(item); 
    return item; 
} 

为什么这不起作用?返回类型是任务。

public async Task<WorkItem> CreateWorkItem(WorkItem workItem) 
{ 
    WorkItem item = new WorkItem(); 
    workItem.Description = "something"; 
    Task<WorkItem> result = await Task.FromResult(item); 
    return result; 
} 
+11

的'async'关键字使得'Task'例如透明的方法和自动换为您的返回值,在该'yield'声明重写把它变成一个迭代的方法一样。 –

+3

在这种情况下,'async'完全不涉及。它指示编译器异步等待任务完成,然后返回结果。 'await Task.FromResult(item)'的结果是'item'。事实上,你可以写'返回item'为你的方法不会做任何事情异步 –

+1

还要注意的是'async'简单地告诉编译器做'await'魔力。如果只在你的方法最后一次通话是异步的,没有必要等待的结果,你可以简单地返回task.Assuming你的方法做了一些真正的异步像一个HTTP调用,你可以写'返回httpClient.GetStringAsync(.. );'并完全删除'async'关键字。 –

回答

1

该生产线项目=等待Task.FromResult(项目)不正确,它实际上应该只是阅读:

return Task.FromResult(item); 

由于该方法被标记为异步,返回的任务,然后谁呼吁CreateWorkItem()会做这样使用的await,所以调用者应该是这样的:

WorkItem item = await CreateWorkItem(myWorkItem); 

或者:

Task<WorkItem> itemTask = CreateWorkItem(myWorkItem); 
item = await itemTask;