任务之外的异常处理

2023-12-08

刚刚注意到奇怪的事情:要从新任务捕获调用者中的异常,lambda 必须标记为异步!?即使 delegate 根本没有await 运算符,这真的有必要吗?

    try
    {
        //Task.Run(() =>      // exception is not caught!
        Task.Run(async () =>  // unnecessary async!?!   
        {
            throw new Exception("Exception in Task");
        }).Wait();
    }
    catch (Exception ex)
    {
        res = ex.Message;
    }

为什么需要异步运算符? 我能找到的所有文档都告诉我们委托不得返回 Void,并且必须等待任务将异常传播给调用者。

添加完整代码:

class Program
{
    static void Main(string[] args)
    {
        var p = new Program();
        p.Run();
    }

public void Run()
{
    string result;

    try
    {
        result = OnSomeEvent((s, ea) => RunSomeTask());
    }
    catch (Exception ex) // Try to catch unhandled exceptions here!
    {
        result = ex.Message;
    }

    Console.WriteLine(result);
    Console.ReadKey();
}

// Some other Framework bult-in event (can not change signature)
public string OnSomeEvent(EventHandler e)
{
    e.Invoke(null, new EventArgs());
    return "OK";
}

private async Task RunSomeTask()
{
    await Task.Run(async () => // do not need async here!!!
    //await Task.Run(() =>     // caller do not catches exceptions (but must)
    {
        throw new Exception("Exception in Task1");
    });
}
}

所以问题是如何抓住前任。没有 async 关键字???


返回的方法Task- 例如Task.Run or async方法 - 将在返回的方法上放置任何异常Task。由您以某种方式观察该异常。通常这是通过以下方式完成的await, 像这样:

await Task.Run(() => { throw ... });

就您而言,问题出在这一行:

result = OnSomeEvent((s, ea) => RunSomeTask());

在这段代码中,RunSomeTask正在返回一个Task, 然后Task永远不会被等待。为了观察异常,您应该await那个任务。

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

任务之外的异常处理 的相关文章

随机推荐

  • 在 javascript 中,哪个更好 `var Obj = Obj || {}` 或 `if (Obj === '未定义' || typeof Obj !== 'object')`

    我想知道以下哪种方法更好 var Obj Obj or if Obj undefined typeof Obj object Obj 有人告诉我第二种方法更好 但我不知道为什么 请您向我解释一下各自的优点和缺点 非常感谢 第二种方法更具体
  • mailto 不适用于大型正文内容

    我正在尝试使用 mailto 函数在我的 Web 应用程序中获取 Outlook 窗口 使用下面的代码 a href Send mail a 如果bodyText小于周围1800人物 但它会截断超过 1800 个字符的数据 如果正文内容超过
  • PHP JPEG 函数不工作

    任何处理 JPEG 的 PHP 函数似乎都无法在我的服务器上运行 这段代码 创建一个空文件 使用 GIF 或 PNG 函数将创建一个包含预期文本 简单文本字符串 的图像 This im imagecreatefromjpeg t
  • 何时或为何在 Oracle 数据库中使用“SET DEFINE OFF”

    我正在观看 Oracle 中的脚本 我看到了一些我不认识的东西 REM INSERTING into database1 Users SET DEFINE OFF Insert into database1 Users id right v
  • PHP:可视化您的应用程序工作流程和功能与功能的关系

    我正在寻找一款可以帮助我可视化应用程序工作流程以及功能与功能关系的软件 我正在使用 codeigniter 而且我的应用程序每天都在变得越来越大 而且是我独自工作 我开始得精神分裂症了 今天我正在构建数据库模型 明天可能是查看js html
  • 如何从 Perl 发出 HTTP GET 请求?

    我正在尝试编写我的第一个 Perl 程序 如果您认为 Perl 对于手头的任务来说是一种糟糕的语言 请告诉我哪种语言可以更好地解决它 该程序测试给定机器和远程 Apache 服务器之间的连接 首先 程序从 Apache 服务器请求目录列表
  • $lookup的Foreign字段可以是嵌套文档的字段吗?

    lookup用于对同一数据库中的未分片集合执行左外连接 以从 连接 集合中过滤文档 以便在 Mongo 中进行处理 lookup from
  • 替换文件中间的文本

    I have txt文件 有几行 username1 123456789 etc etc etc etc username2 1234 etc etc etc etc username3 123456 etc etc etc etc use
  • Node js - 加密和解密文件

    我想在客户端加密文件并将其发送到服务器端 解密 但是当我使用内置的 Node js 时crypto我收到错误 客户端 js const crypto require crypto const cipher crypto createCiph
  • 为什么 read() 不能在 open() 函数中使用 'w+' 或 'r+' 模式

    当我使用带有 r 或 w 参数的打开时 它不想读取文本文件 内部文本文档 hello Python 代码示例 code with open file name r as o print o read output hello code wi
  • 安装时npm权限错误

    我正在尝试在我的服务器上安装 yeoman 但由于某种原因 我总是收到权限被拒绝的错误 npm install g yo root node bin yo gt root node lib node modules yo cli js gt
  • 上传多个文件并查询 Firestore DB - ReactJS

    我读了很多这样的帖子如何将多个文件上传到 Firebase 之前关于这个问题 我尝试了不同的选择 但无法得到结果 我正在使用 React Hook Form 来创建一个非常巨大的表单 现在我必须添加更多输入 以上传文件 并且需要帮助立即完成
  • 在 C# 中创建 CSV 文件

    我正在尝试创建一个 csv 文件 其中每个条目均由用户输入 输入一组值后 应继续输入下一组值 然而我似乎无法做到这一点 每次我运行该程序时 它都会替换以前的值 using System using System IO using Syste
  • 如何将 3D Python/NumPy 数组保存为文本文件?

    我必须启动大量计算 并且每次都必须保存 2D 文件文本 因此我想将结果 实时 存储为 3D 文本文件 每个切片对应一个计算结果 第一次计算没问题 但是当我进行第二次计算时 在 np loadtxt 步骤中 数组维度变成了二维 所以我无法达到
  • 带有文本文件的实体框架(没有数据库!)

    我习惯了表单和数据集 但现在我正在尝试 WPF 和实体框架 我的目标是使用实体框架填充 WPF 中的 DataGrid 但是 我没有数据库 我有简单的文本文件 其中包含我必须解析以填充我的实体的数据 但是 我收到诸如 实体类型 TableN
  • 比较 Chrome 和 Firefox 的字体大小问题

    我建立了一个网站 问题是 chrome 显示font size 1px比火狐浏览器还大 我尝试了几种方法来匹配字体大小 以 px 为单位指定 以 为单位将正文设置为 100 然后将元素设置为0 875em 这些都不起作用 它仍然在 Chro
  • “应用程序窗口预计有一个根视图控制器”条件外观

    我正在使用 Xcode 4 5 和 iOS6 为 iPhone 编写一个应用程序 我也在创建一个新的UIWindow能够管理状态栏的区域 在那里显示消息等 我正在使用故事板和我的appDelegate方法如下所示 BOOL applicat
  • 在 PHP 中通过电子邮件验证用户

    我实际上正在使用 PHP 创建一个 Web 应用程序并寻求验证用户的帮助 与某些网站一样 当您注册时 系统会向您发送一封包含确认链接的电子邮件 我如何在 PHP 中实现它 我只知道我必须使用 PHPmail 功能发送电子邮件 请帮忙 必要的
  • 将字符串中单词的每个实例加粗

    我试图将字符串中单词的每个实例加粗 并删除字符串中第一个单词实例之前的所有内容 我在用着str replace and stristr 这样做 但输出不符合预期 该单词的第一个实例之前的所有内容都被切断 但当我回显该字符串时 该单词的实例不
  • 任务之外的异常处理

    刚刚注意到奇怪的事情 要从新任务捕获调用者中的异常 lambda 必须标记为异步 即使 delegate 根本没有await 运算符 这真的有必要吗 try Task Run gt exception is not caught Task