如何处理Task.Run异常

2024-04-07

我在捕获异常时遇到问题Task.Run这是通过更改代码解决的,如下所示。我想知道这两种方式处理异常之间的区别:

In the Outside方法我无法捕获异常,但是在Inside方法我可以。

void Outside()
{
    try
    {
        Task.Run(() =>
        {
            int z = 0;
            int x = 1 / z;
        });
    }
    catch (Exception exception)
    {
        MessageBox.Show("Outside : " + exception.Message);
    }
}

void Inside()
{
    Task.Run(() =>
    {
        try
        {
            int z = 0;
            int x = 1 / z;
        }
        catch (Exception exception)
        {
            MessageBox.Show("Inside : "+exception.Message);
        }
    });
}

使用 Task.Wait 的想法可以解决问题,但会导致调用线程(如代码所示)等待并因此阻塞,直到任务完成,这有效地使代码同步而不是异步。

而是使用 Task.ContinueWith 选项来实现结果:

Task.Run(() =>
{
   //do some work
}).ContinueWith((t) =>
{
   if (t.IsFaulted) throw t.Exception;
   if (t.IsCompleted) //optionally do some work);
});

如果任务需要在 UI 线程上继续,请使用 TaskScheduler.FromCurrentSynchronizationContext() 选项作为继续的参数,如下所示:

).ContinueWith((t) =>
{
    if (t.IsFaulted) throw t.Exception;
    if (t.IsCompleted) //optionally do some work);
}, TaskScheduler.FromCurrentSynchronizationContext());

此代码将简单地从任务级别重新抛出聚合异常。当然,您还可以在这里引入一些其他形式的异常处理。

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

如何处理Task.Run异常 的相关文章

随机推荐

  • inputFormatter 应该只允许小数和负数

    我想允许用户只添加数字 12345 和十进制数字 如 21321 12312 和负数 如 23423 32432 用户不应该能够添加多个 比如 12 32 并在第一个输入中添加 比如 324 34 而不是324 4323 我用了这个正则表达
  • 如何重置 Azure 上的 Kudu 缓存部署

    我之前在 Azure Web App 上有一个 Node 应用程序 现在是一个 Go 应用程序 问题是当我部署时我从 Kudu 得到这个 Using cached version of deployment script command a
  • Android AdMob SDK - 请求新广告返回相同的广告

    我在主活动中有一个 AdView 其 requestInterval 设置为 推荐 20 秒 问题是广告似乎永远不会改变 我知道当我在 AdListener 上收到对 onReceiveRefreshedAd 的回调时 就会发生刷新 此外
  • Android 在我自己的应用程序中以编程方式隐藏鼠标指针

    我知道这里有一个类似的问题 以编程方式在 Android 屏幕上移动鼠标指针 https stackoverflow com questions 7695258 moving mouse pointer on android screen
  • Firebase - 缺少 Api 密钥

    我正在使用 Google 的 Firebase 数据库 我已经注册到 Firebase 控制台并下载了 JSON 文件 但由于某种原因它给了我这种错误 错误 任务 app processDebugGoogleServices 执行失败 缺少
  • apns Sharp 中的 iPhone 证书错误 对 SSPI 的调用失败

    我有一个托管在 azure 中的数据服务 我从该服务向 iphone 发送通知 但在与 apns 建立连接时出现以下错误 对 SSPI 的调用失败 收到的消息是意外的或格式错误 我还参考了以下链接来解决相同的错误 但仍然收到错误 苹果通过
  • Grails JSON 数组

    我正在将 Foo 对象列表转换为 JSON 字符串 我需要将 JSON 字符串解析回 Foos 列表 但是在下面的示例中 解析为我提供了 JSONObjects 列表而不是 Foos Example List list new Foo fi
  • Delphi TListBox OnClick / OnChange?

    使用 TListBox 获得 OnChange 类型的功能是否有技巧 我可以对组件进行子类化并添加属性等 然后仅在索引更改时执行 OnClick 代码 我还可以使用表单级别变量来破解它以存储当前索引 但只是想知道我是否忽略了之前明显的内容我
  • 如何反向应用隐藏?

    我在 git stash 中保存了一个小补丁 我已将其应用到我的工作副本中git stash apply 现在 我想通过反向应用补丁来取消这些更改 有点像git revert会做但反对藏匿 有谁知道如何做到这一点 澄清 我的工作副本还有其他
  • 用力触摸后选择菜单项时未调用选择器

    我有这段代码 用于响应用力触摸后点击的菜单项 class InterfaceController WKInterfaceController override init super init self addMenuItemWithItem
  • 如何更改 Bootstrap 的 typeahead 选择行为

    使用 Twitter Bootstrap 中的预输入功能时 example http twitter github com bootstrap javascript html typeahead 当我按 TAB 和按 ENTER 时 第一个
  • 使用 Angular.js 创建表

    我正在尝试使用 Angular js 创建一个表 该表的单元格跨越多行 Example http jsfiddle net famedriver kDrc6 http jsfiddle net famedriver kDrc6 示例数据 v
  • Python:清除日志文件

    我开发了一个客户端服务器应用程序并且我已经登录服务器 所以我使用logging模块 我想在服务器中创建一个命令来清除文件 我有测试os remove 但之后 日志不起作用 你有好主意吗 Thanks 截断文件而不是删除它可能会更好 最简单的
  • 如何在反应传单中使用带有动态标记的边界

    我有以下功能反应组件 它可以在 边界 框中正确显示两个静态标记 该框适合两个标记 我希望能够传递一系列纬度和经度值以供地图显示 但我不知道如何做到这一点 这是工作的静态示例 import React from react import Ma
  • 我们如何在 Perforce 中识别父分支?

    假设我有一个主要分支 项目 主 然后我从主分支创建了新分支 项目 1 0 然后我再次从 1 0 创建了分支 项目 2 0 现在 如果有人想知道2 0分支是从哪个分支创建的 用户如何识别呢 选择一个文件并使用 Perforce 修订图查看特定
  • OpenCV 与 Python 错误 - 二进制操作中断言失败 ((mask.type() == CV_8UC1 || mask.type() == CV_8SC1))

    我正在尝试在网络摄像头源上覆盖图像 这是代码的主要部分 Load our overlay image glasses png imgGlasses cv2 imread 1 png Create the mask for the glass
  • 为什么将应用程序上传到 Play 商店后,谷歌地图服务无法运行?

    我的应用程序已准备就绪 并且在上传到 Google Play 商店之前运行良好 当我将应用程序上传到 Play 商店后 谷歌地图服务无法正常工作 由于某种原因地图是空的 为什么会发生这种情况 您需要获取发布密钥 https develope
  • 如何在nodejs服务器中设置HTTP Keep-Alive超时

    我实际上正在对 ExpressJS 服务器进行一些负载测试 我注意到服务器发送的响应包含一个 Connection Keep Alive 标头 据我了解 连接将保持打开状态 直到服务器或客户端发送 连接 关闭 标头 在一些实现中 连接 保持
  • 通过反射更改私有最终字段

    class WithPrivateFinalField private final String s I m totally safe public String toString return s s WithPrivateFinalFi
  • 如何处理Task.Run异常

    我在捕获异常时遇到问题Task Run这是通过更改代码解决的 如下所示 我想知道这两种方式处理异常之间的区别 In the Outside方法我无法捕获异常 但是在Inside方法我可以 void Outside try Task Run