为了账号安全,请及时绑定邮箱和手机立即绑定

等待与task.Result相同的已完成任务?

等待与task.Result相同的已完成任务?

C#
人到中年有点甜 2019-08-13 09:41:06
等待与task.Result相同的已完成任务?我正在阅读Stephen Cleary撰写的“ C#Cookbook中的并发 ”,我注意到以下技巧:var completedTask = await Task.WhenAny(downloadTask, timeoutTask);  if (completedTask == timeoutTask)     return null;  return await downloadTask;downloadTask是一个调用httpclient.GetStringAsync,timeoutTask正在执行Task.Delay。如果它没有超时,那么downloadTask就已经完成了。downloadTask.Result鉴于任务已经完成,为什么有必要做第二次等待而不是返回?
查看完整描述

2 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

如果它timeoutTask是一种产品,这是有道理的Task.Delay,我相信它在书中的含义。

Task.WhenAny返回Task<Task>,其中内部任务是您作为参数传递的任务之一。它可以像这样重写:

Task<Task> anyTask = Task.WhenAny(downloadTask, timeoutTask);await anyTask;if (anyTask.Result == timeoutTask)  
  return null;  return downloadTask.Result;

在任何一种情况下,由于downloadTask已经完成,因此return await downloadTask和之间存在非常小的差异return downloadTask.ResultAggregateException正如@KirillShlenskiy在评论中所指出的那样,后者将抛出任何原始异常。前者只会重新抛出原始异常。

在任何一种情况下,无论何处处理异常,都应该检查AggregateException及其内部异常,以找出错误原因。


查看完整回答
反对 回复 2019-08-13
  • 2 回答
  • 0 关注
  • 676 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信