2015-10-16 132 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;