取消ContinueWith任务链并向调用者报告错误

时间:2014-11-20 16:10:39

标签: c# c#-4.0 task-parallel-library async-await windows-phone-8.1

如果我有一个需要执行多个任务的“登录”命令,并且我的代码如下所示

public async void LoginAsync()
{
    await someService.Connect().ContinueWith(async (r) =>
    {
        //do some stuff with r.Result here
    })
    .ContinueWith(async (r) =>
    {
       //do some other stuff here
    })
    ContinueWith(async (r) =>
    {
       //do even more stuff here
    });

走下快乐的道路,代码按预期执行,一切都很好。

我的问题是,如果链中的某个任务中存在问题/异常,如何取消剩余的任务并报告调用者出错?

我已尝试在ContinueWith语句中抛出异常,但这些不会被我放在调用者代码周围的try / catch块捕获。

我已经阅读了有关CancellationTokenSource的信息,感觉它正好在正确的轨道上,但尝试在MSDN上实现示例代码到这种情况似乎不起作用。

任何指针都会很棒

克里斯

1 个答案:

答案 0 :(得分:4)

这里根本不要使用ContinueWithawait每个Task您想要创建一个延续,因为这将为您提供所需的错误处理语义。

public async Task LoginAsync()
{
    var result = await someService.Connect();
    //do some stuff with r.Result here
    //do some other stuff here
    //do even more stuff here
}

另请注意,这样的方法应返回Task,允许调用者知道操作何时完成,以确定它是否成功完成,以及是否出现故障,以查看异常。