在异步方法中返回和等待任务之间的区别[重复]

2023-12-04

下面的方法有什么区别吗?其中一个比另一个更可取吗?

public static async Task SendAsync1(string to, string subject, string htmlBody) {
  // ...
  await smtp.SendMailAsync(message);
  // No return statement
}

public static Task SendAsync2(string to, string subject, string htmlBody) {
  // ...
  return smtp.SendMailAsync(message);
}

该方法将从 MVC 控制器方法调用;例如:

public async Task<ActionResult> RegisterUser(RegisterViewModel model)
{
  // ...
  await Mailer.SendAsync(user.Email, subject, body);
  return View(model);
}

有两个实际差异:

  1. 第二个选项不会创建允许的状态机机制async-await用法。那将会有一个minor对性能的积极影响。
  2. 异常处理会略有不同。当您将方法标记为async任何异常都存储在返回的任务中(来自异步部分和同步部分),并且仅在等待(或等待)任务时抛出。当它不是async,同步部分的异常行为就像任何其他方法一样。

我的建议:使用第二个可以提高性能,但要注意异常和错误。


显示差异的示例:

public static async Task Test()
{
    Task pending = Task.FromResult(true);
    try
    {
        pending = SendAsync1();
    }
    catch (Exception)
    {
        Console.WriteLine("1-sync");
    }

    try
    {
        await pending;
    }
    catch (Exception)
    {
        Console.WriteLine("1-async");
    }

    pending = Task.FromResult(true);
    try
    {
        pending = SendAsync2();
    }
    catch (Exception)
    {
        Console.WriteLine("2-sync");
    }

    try
    {
        await pending;
    }
    catch (Exception)
    {
        Console.WriteLine("2-async");
    }
}

public static async Task SendAsync1()
{
    throw new Exception("Sync Exception");
    await Task.Delay(10);
}

public static Task SendAsync2()
{
    throw new Exception("Sync Exception");
    return Task.Delay(10);
}

Output:

1-async
2-sync
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在异步方法中返回和等待任务之间的区别[重复] 的相关文章

随机推荐

  • Microsoft Exchange:如何解析可分辨名称

    我该如何解决这个问题 O CHEESE OU FIRST ADMINISTRATIVE GROUP CN RECIPIENTS CN LHALA1 到电子邮件地址 我必须使用 Exchange Web 服务吗 我假设这是legacyExch
  • 如何在 github 中比较/区分 master 和 fork 存储库的特定版本

    Github 上有两个存储库 Repo1 是一个有定期提交的master 尚未被我分叉 Repo2 是大约 2 年前 Repo1 的一个分叉 尚未由我分叉 我想根据 Repo1 中由 Repo2 分支的代码版本 大约 2 年前 在两个存储库
  • 在提交 spring mvc 上绑定子对象

    我是 Java 新手 所以这个问题看起来很简单 我有一个像这样的模型 Entity name website public class Website Id GeneratedValue strategy GenerationType ID
  • PhoneGap / JQuery Mobile - 键盘可见时页面样式中断

    我有一个使用 Phonegap 和 JQuery Mobile 构建的应用程序 每当软键盘显示时 在表单输入等上 整个页面都会调整大小 图像 按钮和文本 我假设有什么东西破坏了CSS 其他人也遇到过这个问题 或者知道为什么会发生这种情况吗
  • 第 2 部分:Web Start 应用程序:并发问题

    根据您的建议这个线程 我尝试使用 FileLock 但是 当我在文件中写入内容时 Excel 文件不知何故被损坏 并且文件中没有任何内容 它变空 其中没有内容 我有以下方法 void writeIntoTheFile XSSFWorkboo
  • 如何在地图上绘制可视化线串

    我有一些来自 Lng 和 lat 的坐标 我将它们组合成一个线串 线串由 2 个点组成 从一点来说starting origin并从一点开始ending destination 这是 Linestring 列的代码 erg2 Linestr
  • 使用 SqlDataAdapter 插入行

    我想使用 SqlDataAdapter 将一行插入数据库 我在 CustomerOrders 数据库中有 2 个表 Custormers 和 Orders 并且有一千多条记录 我想创建一个 GUI 文本框 用于将新客户和订单添加到数据库中各
  • 捆绑 ArrayList > [重复]

    这个问题在这里已经有答案了 有没有办法通过ArrayList
  • Flask 登录和 Heroku 问题

    我有一个示例 Web 应用程序 在 Heroku 上运行 Flask 的 Flask http twittaclone herokuapp com 当我在本地主机上运行它时 登录功能工作正常 当我推送到 heroku 时 它崩溃了 不允许用
  • 保存到 CSV 时 Spark 写入额外行

    我向 parquet 写入了一个包含 1 000 000 行的文件 当我读回 parquet 文件时 结果是 1 000 000 行 df spark read parquet parquet path df count gt gt gt
  • 当我在我的 Web 应用程序中发送 Ajax 请求时,控制器端会在 laravel 的请求参数中给我脚本

    当我发送这个ajax请求时 ajax url URL to admin repcasetracker getdiscount data serialnumber serialnumberdata success function data
  • 最大并发 TCP/IP 连接数 - Windows XP SP3

    有谁知道 Windows XP SP3 上的最大并发 TCP IP 连接数是多少 我正在尝试对一台机器进行负载测试 并且想知道应用程序 在我的例子中是java应用程序 可以向该机器打开的最大tcp连接数是多少 请注意 您通常可能会受到客户端
  • 如何使用内置的 .net 压缩类来压缩目录?

    使用 System IO Compression 命名空间类 GZIPStream 和 DeflateStream 我成功地可以压缩和解压缩单个文件 但是 如果我传递目录名作为压缩目标 则会出现安全异常 我是否必须 递归地 枚举所有文件和子
  • 同时抽象对象和行为的模式

    我们有一个使用外部旅行系统并允许购买门票的项目 我们在本地保存票证信息 但实际状态在外部系统中定义 FirstCorpService srv1 new FirstCorpService FirstCorpTicket tkt1 srv1 b
  • 如何检查 IEnumerable 返回 null 或是否有任何行?

    我有一个类似于下面的 linq 查询 IEnumerable
  • 日期时间和时间戳有什么区别

    Sql Server 中日期时间和时间戳数据类型有什么区别 一个是日期和时间 另一个是每次更新行时更新的列类型 注意时间戳已被弃用 使用行版本反而
  • sum(Array) 表示索引超过矩阵维度[重复]

    这个问题在这里已经有答案了 我是Matlab的新手 我试图做一些图像匹配 图像X更大 图像Y更小 我们的目标是找到y与x的所有可能重叠 然后计算每个这样的RGB的平方差和重叠 即x 2 y 2 z 2 所以我在更大的图像中找到一个位置 i
  • 使用 $.support.cors = true; 是否安全?在 jQuery 中?

    我试图使用 jQuery 的 ajax 方法访问不同域上的 Web 服务 经过一些研究后 看起来它不允许这样做 这是为了防止跨站点脚本而设计的 我遇到了一个解决办法 其中包括这一行 support cors true 在我的 javascr
  • 基于位置的搜索结果查询速度慢

    我有一个查询 用于查找按位置排序的结果 结果还必须考虑增值税 因此这也在查询中 遗憾的是 在未缓存的情况下 查询可能需要 4 秒以上的时间才能运行 任何人都可以发现任何明显的问题或建议我可以做些什么来改进它吗 只是为了澄清查询中发生的情况
  • 在异步方法中返回和等待任务之间的区别[重复]

    这个问题在这里已经有答案了 下面的方法有什么区别吗 其中一个比另一个更可取吗 public static async Task SendAsync1 string to string subject string htmlBody awai