我想抑制任务中触发的异常。我记得,不久前我使用了这段代码来使其成为可能:
void Main(..)
{
Task Fail()
{
throw new Exception("ex");
}
Fail().ContinueWith(t =>
{
var ignored = t.Exception;
ignored?.Handle(e => true);
},
TaskContinuationOptions.OnlyOnFaulted |
TaskContinuationOptions.ExecuteSynchronously);
}
我发现,当我现在在控制台应用程序(.NET 6)中运行它时,发生的唯一逻辑是“观察到”抛出的异常(
t.Exception
),然后,这个实际触发的异常被推送到主方法(外部任务)并使我的应用程序崩溃。
添加
await
,例如:
await (Fail().ContinueWith(..))
没有什么区别。
我不确定为什么我记得它以前有效,但是有什么想法如何实现这个逻辑吗?
您可以使用
Task.Run
; 来实现该结果
Task Fail()
{
throw new Exception("ex");
}
await Task.Run(Fail).ContinueWith(t =>
{
var ignored = t.Exception;
ignored?.Handle(e => true);
Console.WriteLine($"Exception Handled: {t.Exception.Message}");
}, TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously);
如果您想保留
Main()
方法 void
,请删除 async Task Main()
关键字并将这两个方法添加到 await
方法的末尾,而不是使其成为 ContinueWith
;
GetAwaiter().GetResult()
这背后的原因是,你一开始就没有等待 Fail 方法。它在您使用
ContinueWith
方法链接之前运行。如果您在开始时添加一些延迟(例如几百毫秒),您将看到您的代码正在运行。为了防止这种情况,您需要使用 Task.Run()
方法并将其与 ContinueWith
方法链接起来。