2017-02-10 27 views
1

我有一個名爲LogCloudModel的異步方法。我對這種方法的返回類型感到困惑。它調用異步方法InsertIntoTableStorage。以下是完整的代碼示例。在執行Azure表存儲的插入操作後,我應該如何從C#中的Async方法返回?

 private static async void LogCloudModel(ModelExecutionContext context) 
    { 
     var azureStorageAccount = new AzureStorageAccount(); 
     var cloudModelDetail = new CloudModelDetail(); 

     //Populate the cloud model 
     var cloudModelDetailCollection = PopulateCloudModel(context, cloudModelDetail); 

     if (cloudModelDetailCollection == null) return; 
     await InsertIntoTableStorage(azureStorageAccount, cloudModelDetailCollection); 
     LogTableStorageTransactionResult(azureStorageAccount, operationResult, cloudModelDetail.PartitionKey, cloudModelDetail.RowKey); 
     } 

目前,我什麼都沒有返回(void)。我的實現是否正確?

+1

'異步任務'。請注意,您不必實際返回新的Task()或任何東西。返回的任務由編譯器負責。 – Will

+1

您返回的內容取決於您需要返回的內容。如果不需要通知插入成功,則無效。 – Andrew

+0

您可以在[異步最佳實踐](https://msdn.microsoft.com/en-us/magazine/jj991977.aspx)上找到我的文章。 –

回答

3

除非你正在編寫一個event handler回報Task代替void,這樣,來電者可以在其上await

private static async Task LogCloudModel(ModelExecutionContext context) 
    { 
     var azureStorageAccount = new AzureStorageAccount(); 
     var cloudModelDetail = new CloudModelDetail(); 

     //Populate the cloud model 
     var cloudModelDetailCollection = PopulateCloudModel(context, cloudModelDetail); 

     if (cloudModelDetailCollection == null) return; 
     await InsertIntoTableStorage(azureStorageAccount, cloudModelDetailCollection); 
     LogTableStorageTransactionResult(azureStorageAccount, operationResult, cloudModelDetail.PartitionKey, cloudModelDetail.RowKey); 
     } 
1

你的回報取決於你。在這種情況下,您應該至少返回Task而不是無效,但如果您需要返回更多(無),您可以返回Task<T>

1

異步功能僅限於下列返回類型:

  • void
  • Task
  • Task<TResult>

返回Task代替void的主要好處是,它允許調用自己延續附加到返回的任務,這讓檢測時是否有任務失敗或沒有。

我不會返回void,除非您從事件處理程序調用異步方法。

相關問題