2017-02-10 13 views
1

У меня есть асинхронный метод с именем LogCloudModel. Я смущен обратным типом метода. Он имеет вызов метода асинхронизации InsertIntoTableStorage. Ниже приведен полный образец кода.Что мне следует вернуть из моего метода Async на C# после выполнения операции вставки в хранилище таблиц Azure?

 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); 
     } 

В настоящее время я ничего не возвращаю (пусто). Является ли моя реализация правильной?

+1

'async Task'. Обратите внимание: вам не нужно фактически возвращать новую задачу() или что-то еще. Возвращенная задача выполняется компилятором. – Will

+1

То, что вы возвращаете, зависит от того, что вам нужно вернуть. Void отлично, если нет необходимости уведомлять об успехе вставки. – Andrew

+0

Вы можете найти мою статью по [async best practices] (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 вместо void, но если вам нужно вернуть больше (ничего), вы можете вернуть Task<T>.

1

асинхронные функции ограничиваются следующими типами возврата:

  • void
  • Task
  • Task<TResult>

Основное преимущество возвращения Task вместо void является то, что она позволяет вызывающему присоединить свои продолжений к возвращаемому задачи, которые позволяют определить, когда не удалось ли задача или нет.

Я бы не возвращал void, если вы не вызываете метод async из обработчика события.