[英]How to ignore a specific Exception INSTANCE for an async method in Visual Studio (break on thrown)
[英]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.