【发布时间】:2020-04-20 11:49:42
【问题描述】:
我有一些代码需要读取网页(它是 XML)然后处理它。在我得到 XML 之前,我无能为力。
我正在执行一项任务的整个阅读和过程。但是在任务本身中,调用 HttpWebRequest.GetResponseAsync() 而不是 HttpWebRequest.GetResponse() 有什么好处吗?我无法将可取消的令牌传递给 GetResponseAsync(),因此在这种情况下,我认为我应该进行阻塞调用。
这是基于我(仍在学习)对等待的理解。据我了解:
- 在异步方法上调用 await 意味着不要阻塞该方法并立即返回一个 Task 对象。
- 对 Task 对象调用 await 意味着阻塞,直到任务完成或被取消。
更新: 我忘记了一条重要信息——这是任务中的代码。所以我已经没有阻止用户界面。问题是,在这个从功能上讲是一系列顺序操作的后台任务中,使用异步调用有什么价值吗?
【问题讨论】:
-
await不会阻止,无论其目标如何。另外,使用HttpClient而不是HttpWebRequest。HttpClient确实支持CacellationToken。 -
问题集中在错误的细节上。是否使用异步代码取决于应用程序中发生的其他事情。其中“其他”通常是用户界面。有时需要处理大量客户端服务请求的服务器式应用程序。如果您从慢速 Web 服务器获得的延迟无关紧要,请不要使用异步代码。
-
嗨,戴夫。希望事情进展顺利。阻塞调用在等待结果时阻塞线程。
await不会阻塞线程。如果线程是 UI 线程(长时间阻塞 UI 线程是个坏主意)或者您有很多同时操作(您可能会用完线程),这种区别可能很重要。 -
嗨,大卫。这就是为什么 async / await 很难。一个人需要先弄清楚单词。您需要记住,阻塞意味着在进程中保持线程处于活动状态,这就是您需要在心理上映射短语“阻塞”的方式。等待和阻塞是不一样的。
await GetResponseAsnyc()等待但不会阻塞GetResponse()等待的位置,并阻塞进程/操作系统内存。 async / await 的主要目的是内存管理。它的并行化方面更多的是一个副产品,因为它通过 TPL / Task 表现出来,您可能需要或不需要等待。
标签: .net asynchronous async-await