使用“Fire and Forget”任务捕获异常
在返回任务的“Fire and Forget”方法的上下文中,一种常见的方法就是用扩展的方法悄悄地丢弃它们。然而,这种方法可能会隐藏任务执行过程中出现的意外异常。
考虑以下问题:将扩展方法定义为异步方法是否更为谨慎,例如:
public static async void Forget(this Task task) { await task; }
通过这样做,编程错误将触发异常,提醒用户潜在的问题。然而,这种方法背离了真正的“即发即忘”范例,其中完成和成功被忽略。
理解“即发即忘”的语义在这里至关重要。真正的“即发即忘”方法意味着任务的结果无关紧要。尽管如此,在某些情况下,您可能希望处理特定的预期异常,而忽略其他异常。
处理预期异常
要解决此问题,可以将扩展方法修改为如下:
public static async void Forget(this Task task, params Type[] acceptableExceptions) { try { await task.ConfigureAwait(false); } catch (Exception ex) { // TODO: consider whether derived types are also acceptable. if (!acceptableExceptions.Contains(ex.GetType())) throw; } }
使用此修改后的方法,您可以指定应静默处理的可接受异常类型的列表处理。任何其他异常都会触发异常,提醒您潜在的问题。
值得注意的是,建议使用await关键字而不是ContinueWith。这种选择避免了潜在的调度问题,并使错误处理更加简单。
以上是'即发即忘”任务是否应该异步处理异常?的详细内容。更多信息请关注PHP中文网其他相关文章!