- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我阅读了一些关于 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/
我正在使用 Neo4jClient 对 Neo4j 数据库进行相当长的查询,并得到一个非常随机发生的异常。如何解决这个问题? System.AggregateException: One or mor
演示问题的代码: 假设 Test Thing 是一个真实的实现,例如 DB 调用。 documentation for Web API states未处理的异常将被捕获到一个全局处理程序中,允许您处理
我在 Windows Phone 8.1 上发出一些 http 请求,有时发出请求会返回此异常 TaskCanceledException A task was canceled 我不知道这是否是导致
我阅读了一些关于 TaskCancellations 的话题。但是,我找不到一个简单问题的解决方案:当我的任务失败时如何获取默认值? 我不能(!)修改任务本身并在其周围放置一个 try catch 包
我是一名优秀的程序员,十分优秀!