当签名是公共异步时,为什么没有必要返回任务Task MethodName?

时间:2016-12-26 17:11:53

标签: c# asynchronous

我有一些工作正常的代码,但我不明白为什么。我的方法使用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语句的情况下进行编译和工作?

1 个答案:

答案 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