我读了一些关于TaskCancellations的线程.但是,我找不到一个简单问题的解决方案:当我的任务失败时如何获得默认值?
我不能(!)修改任务本身并在它周围放置一个try catch包装器.我当然可以试试看,但是ContinueWith
如果可能的话,我想处理这个问题.
public Task> LoadExample() { Task
> task = LoadMyExampleTask(); task.ContinueWith(t => default(List
), TaskContinuationOptions.OnlyOnFaulted); return task; }
我认为这是处理问题的正确方法.但是,我的应用程序抛出一个JsonParseException
(称为LoadMyExampleTask
).我希望得到null或(甚至更好)一个空列表.
事实上,我想要的只是:
var emptyOrFilledList = await LoadExample(); // guaranteed no exception thrown
根据Luaan的好答案,我用defaultValue选项编写了一个扩展方法:
public static TaskDefaultIfFaulted (this Task @this, T defaultValue = default(T)) { return @this.ContinueWith(t => t.IsCompleted ? t.Result : defaultValue); }
编辑:await myTask.DefaultifFaulted()
刚扔了一个
[ERROR]致命的未处理的异常:System.AggregateException
你确定每个例外都被抓住了吗?
如果你想要,你不能返回原始任务 - 你需要返回继续.
public Task> LoadExample() { Task
> task = LoadMyExampleTask(); return task.ContinueWith(t => t.IsFaulted || t.IsCanceled ? default(List
) : t.Result); }
你原来的代码确实允许延续到当原始任务故障运行,但你没看过的状态,即任务-一个任务都有一个负责处理错误延续其实是完全不相干的什么的await
原始任务将尽.
当然,将它变成通用的辅助方法相当容易:
public static TaskDefaultIfFaulted (this Task @this) { return @this.ContinueWith (t => t.IsCanceled || t.IsFaulted ? default(T) : t.Result); }