等待与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.Result
。AggregateException
正如@KirillShlenskiy在评论中所指出的那样,后者将抛出任何原始异常。前者只会重新抛出原始异常。
在任何一种情况下,无论何处处理异常,都应该检查AggregateException
及其内部异常,以找出错误原因。
- 2 回答
- 0 关注
- 705 浏览
添加回答
举报
0/150
提交
取消