捕获 async void 方法抛出的异常

2024-01-31

使用 Microsoft for .NET 的异步 CTP, 是否可以在调用方法中捕获异步方法抛出的异常?

public async void Foo()
{
    var x = await DoSomethingAsync();

    /* Handle the result, but sometimes an exception might be thrown.
       For example, DoSomethingAsync gets data from the network
       and the data is invalid... a ProtocolException might be thrown. */
}

public void DoFoo()
{
    try
    {
        Foo();
    }
    catch (ProtocolException ex)
    {
          /* The exception will never be caught.
             Instead when in debug mode, VS2010 will warn and continue.
             The deployed the app will simply crash. */
    }
}

所以基本上我希望异步代码中的异常冒泡到我的调用代码中 如果这可能的话。


读起来有点奇怪,但是是的,异常会冒泡到调用代码 - 但只是if you await or Wait()打电话给Foo.

public async Task Foo()
{
    var x = await DoSomethingAsync();
}

public async void DoFoo()
{
    try
    {
        await Foo();
    }
    catch (ProtocolException ex)
    {
          // The exception will be caught because you've awaited
          // the call in an async method.
    }
}

//or//

public void DoFoo()
{
    try
    {
        Foo().Wait();
    }
    catch (ProtocolException ex)
    {
          /* The exception will be caught because you've
             waited for the completion of the call. */
    }
} 

正如斯蒂芬·克利里 (Stephen Cleary) 在书中写道Async/Await - 异步编程的最佳实践 https://learn.microsoft.com/en-us/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming:

Async void 方法具有不同的错误处理语义。当异步任务或异步任务方法抛出异常时,该异常将被捕获并放置在任务对象上。对于 async void 方法,没有 Task 对象,因此 async void 方法抛出的任何异常都将直接在 async void 方法启动时处于活动状态的 SynchronizationContext 上引发。

请注意,使用Wait()如果 .NET 决定同步执行您的方法,可能会导致您的应用程序阻塞。

这个解释http://www.interact-sw.co.uk/iangblog/2010/11/01/csharp5-async-exceptions http://www.interact-sw.co.uk/iangblog/2010/11/01/csharp5-async-exceptions非常好 - 它讨论了编译器为实现这一魔力而采取的步骤。

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

捕获 async void 方法抛出的异常 的相关文章

  • 头文件中实现的函数的静态与内联

    我想到的方式inline在 C 中用于链接 作用域 我把它放在同一个篮子里extern and static对于全局对象 通常 对于在头文件中实现的函数 我的首选解决方案是将其设为静态 In Foo h static void foo Do
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • C++ 指针和对象实例化

    这有效 MyObject o o new MyObject 而这并不 MyObject o new MyObject Why 关键词new 返回一个指针 http msdn microsoft com en us library kewsb
  • 如何从不同的线程访问控件?

    如何从创建控件的线程以外的线程访问控件 避免跨线程错误 这是我的示例代码 private void Form1 Load object sender EventArgs e Thread t new Thread foo t Start p
  • 无法将参数从 `const char *` 转换为 `char *`

    鉴于此代码 void group build int size std string ips Build the LL after receiving the member list from bootstrap head new memb
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 如何调试.NET Windows Service OnStart方法?

    我用 NET 编写的代码仅在作为 Windows 服务安装时才会失败 该故障甚至不允许服务启动 我不知道如何进入 OnStart 方法 如何 调试 Windows 服务应用程序 http msdn microsoft com en us l
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • 查找方法不适用于 EF6.1 模拟

    我已经使用这些 msdn 指南设置了模拟 使用模拟框架进行测试 EF6 及以上 http msdn microsoft com en us data dn314429 var bsAc db BusAcnts FirstOrDefault
  • 节点*链表中的下一个

    我是数据结构和算法的新手 我遇到了以下代码 typedef struct node int data node next 谁能告诉我为什么我们要声明节点 next next 不能声明为 int next 吗 因为你希望能够做到n gt ne
  • 如果finally 块包含await,为什么*有时*不会在ThreadAbortException 上执行?

    UPDATE 我不认为这个问题是重复的ThreadAbortException最后可以跳过吗 https stackoverflow com questions 18002668 can threadabortexception skip
  • linq where 子句和 count 导致 null 异常

    除非 p School SchoolName 结果为 null 否则下面的代码将起作用 在这种情况下 它会导致 NullReferenceException if ExistingUsers Where p gt p StudentID i
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 调试错误:在 vc++ 项目中使用 COM 时发生 所需的运行时?

    我为我的工作创建了一个 COM 组件 我也注册了该组件 在我的系统上 我有两个虚拟机工作站 在我的第一个工作站中 它运行良好 在我的第二个工作站中 它显示一个包含消息的错误框该程序需要一段时间并以不寻常的方式关闭 请联系应用程序管理员 我认
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • 如何释放字符串未使用的容量

    我正在程序中处理很多字符串 这些字符串数据在读入我的程序后的整个生命周期内都不会改变 但由于 C 字符串保留了容量 因此浪费了大量肯定不会被使用的空间 我尝试释放这些空间 但没有成功 以下是我尝试过的简单代码 string temp 123
  • 基础设施 - 同步和异步接口和实现? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在实现库 基础设施时 并且该 API 的用户希望同步和异步使用代码 我读到混合同步和异步并不是一个好主意 例如 同步实现包括等待异步实现 显然
  • C - 获取外部IP地址

    我需要通过 C C 调用获取我的公共 IP 地址 我知道作为替代方案 我可以从 http whatismyip akamai com 等外部链接获取 我写了一个示例来获取外部IP地址 但我的程序没有返回外部 IP 地址 我正在获取内部 IP
  • 创建进程默认浏览器

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 我想获取线程 id 因此 ShellExecute 无法获取线程 id 因此我开始使用

随机推荐

  • Elixir 中的宏扩展:如何定义两个宏,一个使用另一个宏?

    我正在 Elixir 中尝试宏 因此 我要展示的代码当然应该使用简单的函数来完成 但是 我正在尝试 我想定义2个宏 A和B 并让A使用B来试验宏扩展 当我使用 A 时 我收到一个编译错误 指出function B is 不明确的 这是代码
  • 更改 :before 和 :after 伪元素的样式? [复制]

    这个问题在这里已经有答案了 这就是我的代码的样子 mainSpan before css background url gfx cmn main bg png 这似乎不起作用 所以我问是否可以添加 使用 jQuery 将背景图像添加到阴影元
  • 如何在 cmake 上获取库的完整本机名称?

    我需要将构建的库的本机名称 libfoo so 或 foo dll 传递给 add custom command 如何获取目标的完整库名称 该财产LOCATION有它但有完整的路径 属性 OUTPUT NAME 不返回任何内容 您可以使用生
  • 使用 Storyboard 中的属性字符串本地化 UILabel

    我有一个 UILabel 其文本在情节提要中设置为 归属 当我生成 Main strings 文件以翻译成其他语言时 该标签的文本不会出现 我尝试通过复制对象 ID 手动将条目添加到 Main strings 文件中 我尝试设置 text
  • Firebird x Windows 7 x gds32.dll错误

    我有一个来自新客户的 fdb 文件 firebird 他不知道版本 我尝试过使用一些 GUI 来访问数据库 但没有成功 他们都说它缺少 gds32 dll 但我有这个 我已将此 dll 复制到 GUI 文件夹 已将 dll 复制到 syst
  • GlGenTextures 不断返回 0

    我正在尝试生成这样的纹理 define checkImageWidth 64 define checkImageHeight 64 static GLubyte checkImage checkImageHeight checkImageW
  • 如何模拟 @InjectMocks 类的方法?

    例如我有处理程序 Component public class MyHandler AutoWired private MyDependency myDependency public int someMethod return anoth
  • 回调()或返回回调()

    可能我对 Node 的事件循环了解不够 说我有一个函数foo其中包含一个异步函数async func 我有吗 1 function foo callback stuff here async func function do somethi
  • 负载平衡线程请求百分比

    我有一个工作线程池 我在其中根据百分比向它们发送请求 例如 工作人员 1 必须处理总请求的 60 工作人员 2 必须处理总请求的 31 最后工作人员 3 必须处理 9 我需要从数学上知道如何缩小数字并保持比率 这样我就不必向线程 1 发送
  • 如何在 MFC 中的 CRichEditCtrl 中显示红色波浪线

    我正在致力于在 MFC 应用程序中实现拼写检查器 我想要做的是在拼写错误的单词下显示红线 我找到了一个示例 但它仅适用于简单的编辑框 因为它可以简单地使用编辑控件默认字体进行计算来绘制波浪线 但它不适用于丰富的编辑控件 因为在丰富的编辑控件
  • Vue组件通信

    我有两个 Vue 组件 Vue component A Vue component B 如何从组件B访问组件A 组件之间的通信如何进行 跨组件通信在 Vue js 文档中并没有引起太多关注 也没有很多教程涵盖这个主题 由于组件应该是隔离的
  • 用于生成用户友好的相对时间戳的 PHP 库

    我正在寻找 PHPlibrary生成用户友好的时间表示 例如 当时间戳为 两小时前 时time 2 3600 有几个现有问题及其答案和博客文章 1 https stackoverflow com questions 2690504 php
  • 为什么 build_runner 在 dart/flutter 中序列化 JSON 时不生成文件

    我只是尝试使用 3 个月前存储的相同命令生成文件 我对后端和 devops 不太擅长 但现在它不再生成文件了 它告诉我使用我不记得的删除命令 但即使使用该命令 我的文件仍然不会生成 这就是我的日志的样子 下面您可以找到一个简单类的代码 我的
  • 为什么 swift 中函数有多种返回类型?

    我注意到这个函数有一个独特的返回类型 func chooseStepFunction backward Bool gt Int gt Int func stepForward input Int gt Int return input 1
  • FileSystemWatcher 在网络机器上设置凭据

    有没有办法为 filesystemwatcher 对象设置凭据 该应用程序在不同的用户上运行 该用户无权访问网络计算机上的目录 但我想向 filesystemwatcher 对象提供凭据 以便它可以侦听该目录 可行吗 不需要 只需确保您的应
  • PHP 强制下载损坏的 .xlsx 文件

    我正在开发一个允许教师上传文档和学生下载文档的网站 然而 有一个问题 Microsoft Word docx 文件下载完美 但下载 Excel xlsx 文件时 Excel 会显示 此文件已损坏 无法打开 对话框 任何对此的帮助将不胜感激
  • Windows 手机 8.1 |如何判断本地文件夹中是否存在文件?

    如何确定文件是否存在于本地文件夹中 Windows Storage ApplicationData Current LocalFolder 在 Windows Phone 8 1 上 不幸的是 目前没有直接的方法来检查文件是否存在 您可以尝
  • PyQt5 QWebEngineView不显示网页

    The part where webpage should be rendered gets white for a fraction of second and then gets empty 这是我的代码 基本上是https www p
  • 构建两个独立数据库集成的最佳方法?

    我在工作中遇到了以下问题 我没有经验或知识来回答这些问题 我希望你们中的一些明智的人能够为我指明正确的方向 任何答案将不胜感激 Scenario 实施立面图案 http en wikipedia org wiki Facade patter
  • 捕获 async void 方法抛出的异常

    使用 Microsoft for NET 的异步 CTP 是否可以在调用方法中捕获异步方法抛出的异常 public async void Foo var x await DoSomethingAsync Handle the result