gpt4 book ai didi

c# - ContinueWith 和 TaskCancellation - 如果任务失败,如何返回默认值?

转载 作者:太空狗 更新时间:2023-10-29 17:43:07 25 4
gpt4 key购买 nike

我阅读了一些关于 TaskCancellations 的话题。但是,我找不到一个简单问题的解决方案:当我的任务失败时如何获取默认值?

我不能(!)修改任务本身并在其周围放置一个 try catch 包装器。我当然可以在 await 周围放置一个 try-catch,但如果可能的话,我想用 ContinueWith 来处理这个问题。

public Task<List<string>> LoadExample()
{
Task<List<string>> task = LoadMyExampleTask();
task.ContinueWith(t => default(List<string>), TaskContinuationOptions.OnlyOnFaulted);
return task;
}

我认为这是处理问题的正确方法。但是,我的应用程序抛出一个 JsonParseException(在 LoadMyExampleTask 中调用)。我希望得到 null 或(甚至更好)一个空列表。

其实我想要的只是:

var emptyOrFilledList = await LoadExample(); // guaranteed no exception thrown

基于 Luaan 的出色回答,我编写了一个带有默认值选项的扩展方法:

public static Task<T> DefaultIfFaulted<T>(this Task<T> @this, T defaultValue = default(T))
{
return @this.ContinueWith(t => t.IsCompleted ? t.Result : defaultValue);
}

编辑:await myTask.DefaultifFaulted() 刚刚抛出一个

[ERROR] FATAL UNHANDLED EXCEPTION: System.AggregateException

你确定每个异常都被捕获了吗?

最佳答案

如果你想要那样,你不能返回原始任务 - 你需要返回延续。

public Task<List<string>> LoadExample()
{
Task<List<string>> task = LoadMyExampleTask();
return task.ContinueWith(t =>
t.IsFaulted || t.IsCanceled ? default(List<string>) : t.Result);
}

您的原始代码确实允许在原始任务出现故障时继续运行,但您没有读取那个任务的状态——任务具有处理错误的延续这一事实完全是与原始任务上的 await 将执行的操作无关。

当然,把它变成一个通用的辅助方法是相当容易的:

public static Task<T> DefaultIfFaulted<T>(this Task<T> @this)
{
return @this.ContinueWith (t => t.IsCanceled || t.IsFaulted ? default(T) : t.Result);
}

关于c# - ContinueWith 和 TaskCancellation - 如果任务失败,如何返回默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34197745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com