在异步方法中,代码不是await
任何东西,是否有人将其标记为异步,等待任务,然后返回?
除了潜在的不必要之外,这样做的负面影响是什么?
对于此示例,请假设QueryAsync<int>
返回Task<int>
。
private static async Task<int> InsertRecord_AsyncKeyword(SqlConnection openConnection)
{
int autoIncrementedReferralId =
await openConnection.QueryAsync<int>(@"
INSERT INTO...
SELECT CAST(SCOPE_IDENTITY() AS int)"
);
return autoIncrementedReferralId;
}
private static Task<int> InsertRecord_NoAsyncKeyword(SqlConnection openConnection)
{
Task<int> task =
openConnection.QueryAsync<int>(@"
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);
}
答案 0 :(得分:7)
答案 1 :(得分:5)
不,你不应该只将async
添加到没有await
的方法中 - 甚至还有编译器警告。
你也不应该在这种方法中不必要地添加await
,因为它会使编译器为该方法生成更复杂的代码,并带来一些相关的性能影响。
从时间的角度来看,两种模式之间没有可观察到的差异 - 任务仍将异步运行,您仍然可以立即等待或稍后在调用者中等待。
我可以想到一个区别 - 如果你直接返回任务,调用者可以使用ConfigureAwait(false)
,它将在其他线程上完成。当你await
内部任务的方法时,该方法控制执行await
之后的代码的位置。
请注意,最后使用单await
的方法的成本并没有明显低于没有的方法 - 所以如果您希望在所有异步方法上编码样式一致使用async
,那么它很可能除外罕见的时间关键部分。