加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如果我返回一个Task并且没有等待任何事情,我应该使用async

发布时间:2020-12-15 04:25:17 所属栏目:百科 来源:网络整理
导读:在异步方法中,代码没有等待任何东西,是否有人将其标记为异步,等待任务,然后返回? 除了潜在的不必要之外,这样做的负面影响是什么? 对于此示例,请假设QueryAsync int返回Task int. private static async Taskint InsertRecord_AsyncKeyword(SqlConnection op
在异步方法中,代码没有等待任何东西,是否有人将其标记为异步,等待任务,然后返回?

除了潜在的不必要之外,这样做的负面影响是什么?

对于此示例,请假设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);
}

解决方法

不,你不应该只是在没有等待的情况下向方法添加异步 – 甚至还有编译器警告.

您也不应该在这样的方法中不必要地添加await,因为它会使编译器为该方法生成更复杂的代码,并带来一些相关的性能影响.

从时间的角度来看,两种模式之间没有可观察到的差异 – 任务仍将异步运行,您仍然可以立即等待或稍后在调用者中等待.

我可以想到一个区别 – 如果你直接返回任务,调用者可能会使用ConfigureAwait(false),它将在其他线程上完成.当你等待你内部的任务时,该方法控制执行await之后的代码.

请注意,在最后使用单个等待的方法的成本并没有明显低于没有的方法 – 因此,如果您希望在所有异步方法上编码样式一致使用async,那么除了罕见的时间关键部分之外,它可能很好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读