忽略ContinueWith中的任务异常

问题描述 投票:0回答:1

我想抑制任务中触发的异常。我记得,不久前我使用了这段代码来使其成为可能:

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(..))

没有什么区别。

我不确定为什么我记得它以前有效,但是有什么想法如何实现这个逻辑吗?

c# task task-parallel-library continuewith
1个回答
0
投票

您可以使用

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
方法链接起来。

© www.soinside.com 2019 - 2024. All rights reserved.