繁体   English   中英

忽略异步方法中的异常

[英]Ignore an exception in an async method

我正在编写一个需要执行一些异步方法的应用程序(.Net 5)。 首先它创建一个 Job,然后它在 Job 中创建一个 Task,然后等待 Task 完成,最后删除 Job。 就上下文而言,这些是 Azure 批处理作业和任务,但我提到它只是为了表明我所说的任务不是 .Net 框架任务,而是一个简单的 class 恰好被命名。 除此之外,这是 Azure 批次相关的事实没有区别。

我已经编写了这个方法来执行这些步骤:

    private async Task ExecuteTask(string jobName, string taskName, CloudTask task)
    {
      string poolName = ConfigurationManager.AppSettings["PoolName"];
      await taskScheduler.QueueBatchJob(poolName, jobName);
      await taskScheduler.QueueBatchTask(jobName, task);
      taskScheduler.WaitForTaskToComplete(jobName, taskName);
      _ = this.taskScheduler.DeleteJob(jobName); // I am intentionally not awaiting here
    }

调用方法有一个 try/catch,额外的代码可能需要一段时间才能执行。 我故意不等待 DeleteJob 方法,因为我不需要这样做才能继续,而且我也不关心它是否失败。 它在那里进行清理,但以后可能会有另一个过程来进行适当的清理。

现在,我的问题是,如果该方法实际上存在错误会发生什么? 如果父方法没有完成,它会被父 try/catch 捕获吗? 我绝对不希望这样,所以如果是这样,我怎么能忽略它?

我将简单地用这里的一些引用来回答这个问题:

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

稍后在同一篇文章中

当你 await 一个 Task 时,第一个异常会被重新抛出,因此你可以捕获特定的异常类型(例如 InvalidOperationException)。

这基本上意味着:该方法返回的Task将包含Exception ,但只有在await它时才会引发。 因此,不等待Task会导致所有异常都被Task object 吞噬。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM