如果我有一个需要执行多个任务的“登录”命令,并且我的代码如下所示
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上实现示例代码到这种情况似乎不起作用。
任何指针都会很棒
克里斯
答案 0 :(得分:4)
这里根本不要使用ContinueWith
。 await
每个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
,允许调用者知道操作何时完成,以确定它是否成功完成,以及是否出现故障,以查看异常。