我有一些工作正常的代码,但我不明白为什么。我的方法使用ExecuteReaderAsync,ExecuteNonQueryAsync和WriteToServerAsync执行一些SQL操作。 WriterToServerAsync是我调用的最后一个。
我最初使用签名public async void Run()编写了该方法,但我使用的Hangfire作业运行器不会接受异步,除非它返回一个Task。我将签名更改为异步任务运行(),然后尝试找出如何从方法返回任务。
我认为我可以返回从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);
}
为什么在没有任务的return语句的情况下进行编译和工作?
答案 0 :(得分:4)
为什么在没有任务的return语句的情况下进行编译和工作?
因为返回类型Task相当于可以等待的异步方法的void(一个不返回任何值的方法)。
有关C#中的async / await关键字的详细信息,请参阅以下链接。
Async / Await - 异步编程的最佳实践: https://msdn.microsoft.com/en-us/magazine/jj991977.aspx
使用异步和等待(C#)进行异步编程: https://msdn.microsoft.com/en-us/library/mt674882.aspx