当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《ContinueWith和TaskCancellation-如果任务失败,如何返回默认值?》经验,为你挑选了1个好方法。

我读了一些关于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 Task DefaultIfFaulted(this Task @this, T defaultValue = default(T))
{
   return @this.ContinueWith(t => t.IsCompleted ? t.Result : defaultValue);
}

编辑:await myTask.DefaultifFaulted()刚扔了一个

[ERROR]致命的未处理的异常:System.AggregateException

你确定每个例外都被抓住了吗?



1> Luaan..:

如果你想要,你不能返回原始任务 - 你需要返回继续.

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

你原来的代码确实允许延续到当原始任务故障运行,但你没看过的状态,任务-一个任务都有一个负责处理错误延续其实是完全不相干的什么的await原始任务将尽.

当然,将它变成通用的辅助方法相当容易:

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

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有