当前位置: 首页 > 知识库问答 >
问题:

如果我返回任务而不等待任何东西,是否应该使用async

孔嘉茂
2023-03-14

在代码不等待任何东西的异步方法中,是否有人会将其标记为异步,等待任务,然后返回?

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

对于本例,请假设querysync

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);
}

共有2个答案

侯博易
2023-03-14

不,您不应该只向方法添加async,而不添加wait——甚至还有编译器警告。

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

从时间的角度来看,两种模式之间没有明显的区别——任务仍然会异步运行,你仍然可以立即或在调用者的稍后时间等待。

我可以想到一个区别——如果您直接返回任务,调用方可能会使用ConfigureAwait(false),它将在其他线程上完成。当您await方法中的任务时,该方法控制执行await之后的代码的位置。

请注意,最后使用单个await的方法的成本并不比不使用的方法的成本低很多-因此,如果您更喜欢在所有异步方法上一致使用async,那么除了很少的时间关键部分之外,这可能是很好的。

刘京
2023-03-14

阅读Stephen Cleary的博客文章:

异步和等待

 类似资料:
  • 问题内容: 如果“表”没有行。什么是最简单的检查方法? 问题答案: 您可以使用mysql_num_rows($ results) 来检查是否返回了0行,或者使用以下更快的替代方法:

  • 问题内容: 我有以下代码: 该文件包含以下内容: 但是由于某种原因,每次都只返回一个空列表。 代码中可能存在愚蠢的错误或错字,但我只是找不到。提前致谢。 问题答案: 你读的文件 已经 和文件指针不是在 末尾 的文件。然后调用将不会返回数据。 仅读取一次文件: 另一种选择是在重新阅读之前先回到开头: 但这只是浪费CPU和I / O时间。 最好的办法是尝试和阅读 小 数据量,或寻求到了最后,通过采取文

  • 我试图解决Leetcode上的二和算法: 给定一个整数数组,返回两个数字的索引,使它们相加到一个特定的目标。您可以假设每个输入都有一个解决方案,并且不能两次使用同一个元素。 我想到了这个: 问题是它没有返回任何内容,也没有返回打印的声明。有什么想法吗?

  • 您好,我目前正在处理HackerRank上的Java挑战,遇到了一个用我的代码无法解决的问题。 提示如下:, 给定一个字符串 s 和一个整数 k,完成该函数,以便它找到字典上长度 k 的最小和最大子字符串。 样本输入: welcometojava 3 示例输出: ava wel 最小和最大的子字符串仅基于第一个整数。因此,对于我的解决方案,我决定创建一个整数数组,并使用 String s 中每个可

  • 这是我的查看页面代码 我在codeigniter中检查codeigniter表单验证,它复制并粘贴了我的控制器,但出现了相同的错误 这是我的控制器代码 表单验证不返回任何内容和

  • 在C#中,我有以下两个简单的例子: 第一个示例创建一个打印“开始”的任务,等待5秒钟打印“完成”,然后结束任务。我等待任务完成,然后打印“全部完成”。当我运行测试时,它会按预期运行。 第二个测试应该具有相同的行为,只是由于使用了async和Wait,任务内部的等待应该是非阻塞的。但是这个测试只打印“开始”,然后立即打印“全部完成”和“完成”,永远不会打印。 我不知道我为什么会有这样的行为:S非常感