2016-12-26 21 views
0

我有一些代码工作正常,但我不明白为什么。我的方法使用ExecuteReaderAsync,ExecuteNonQueryAsync和WriteToServerAsync执行一些SQL操作。 WriterToServerAsync是我所调用的最后一个。为什么当签名是公共异步Task MethodName时不需要返回任务?

我最初编写方法时使用了签名public async void Run(),但我使用的Hangfire作业运行器不会接受异步,除非它返回一个Task。我将签名更改为async Task Run(),然后试图找出如何从该方法返回任务。

我认为我可以只返回从WriteToServerAsync返回的同一个任务,但这不会编译。我完全删除了返回语句。编译器不会抱怨,并且该方法正常工作。

public async Task Run() 
{ 
    // Start querying the source first as it is the slowest operation... 
    var sqlSourceConnection = new SqlConnection(sourceConnectionString); 

    // The query is kind of slow so it needs more than the default 30 second timeout... 
    var sqlSourceCommand = new SqlCommand(SourceDataSql, sqlSourceConnection) { CommandTimeout = 180 }; 

    sqlSourceConnection.Open(); 

    // Query the records from the source... 
    var querySourceDataTask = sqlSourceCommand.ExecuteReaderAsync(); 

    // Delete existing records from target to make way for the new set... 
    var sqlTargetConnection = new SqlConnection(targetConnectionString); 

    sqlTargetConnection.Open(); 
    var sqlTargetTransaction = sqlTargetConnection.BeginTransaction(IsolationLevel.ReadCommitted); 

    var deleteRowsTask = sqlDeleteCommand.ExecuteNonQueryAsync(); 

    // Wait for the delete and query tasks to finish before attempting the bulk copy... 
    await Task.WhenAll(deleteRowsTask, querySourceDataTask); 

    await sqlBulkCopy.WriteToServerAsync(querySourceDataTask.Result); 
} 

为什么编译和工作时没有任务的返回语句?

+1

这是基础知识[如何异步/等待作品( http://stackoverflow.com/questions/14177891/can-somebody-please-explain-async-await)。 –

+0

这个人有非常好的博客,在那里你可以找到很多关于异步/等待的有趣的东西。和更多:) http://blog.stephencleary.com/ – Sasha

回答

4

为什么编译和工作时没有任务的返回语句?

因为返回类型任务是空隙用于异步方法可以等待(不返回任何值的方法)的等价物。

有关C#中的async/await关键字的更多信息,请参阅以下链接。

异步/等待 - 最佳实践异步编程:https://msdn.microsoft.com/en-us/magazine/jj991977.aspx

异步编程与异步和等待(C#):https://msdn.microsoft.com/en-us/library/mt674882.aspx

+0

完美。这些文章是让我加速异步的好资源。 –

相关问题