如果我正在返回一个任务而不是等待任何事情,我应该使用异步
在异步方法中代码没有await
任何东西,是否有人将其标记为异步,等待任务,然后返回?
除了潜在的不必要之外,这样做的负面影响是什么?
对于此示例,请假设QueryAsync
返回Task
。
private static async Task InsertRecord_AsyncKeyword(SqlConnection openConnection) { int autoIncrementedReferralId = await openConnection.QueryAsync(@" INSERT INTO... SELECT CAST(SCOPE_IDENTITY() AS int)" ); return autoIncrementedReferralId; } private static Task InsertRecord_NoAsyncKeyword(SqlConnection openConnection) { Task task = openConnection.QueryAsync(@" INSERT INTO... SELECT CAST(SCOPE_IDENTITY() AS int)" ); return task; } // Top level method using (SqlConnection connection = await DbConnectionFactory.GetOpenConsumerAppSqlConnectionAsync()) { int result1 = await InsertRecord_NoAsyncKeyword(connection); int result2 = await InsertRecord_AsyncKeyword(connection); }
不,你不应该只是在没有await
情况下向方法添加async
– 甚至还有编译器警告。
你也不应该在这种方法中不必要地添加await
,因为它会使编译器为该方法生成更复杂的代码,并带来一些相关的性能影响。
从时间的角度来看,两种模式之间没有可观察到的差异 – 任务仍将异步运行,您仍然可以立即等待或稍后在调用者中等待。
我可以想到一个区别 – 如果你直接返回任务,调用者可能会使用ConfigureAwait(false)
,它将在其他线程上完成。 当你await
你内部的任务时,该方法控制执行await
之后的代码。
请注意,在最后使用单个await
的方法的成本并没有明显差于没有的方法 – 因此,如果您希望在所有异步方法上编码样式一致使用async
,那么除了罕见的时间关键部分之外,它可能很好。
阅读Stephen Cleary撰写的这篇博客文章:
等待异步和等待