【问题标题】:Scheduling of I/O-bound operations in .NET.NET 中 I/O 绑定操作的调度
【发布时间】:2013-06-26 10:40:46
【问题描述】:

如果我在一个不需要响应的线程上,并且继续执行依赖于 I/O 绑定调用(HttpClient 请求)的结果,那么异步实现调用是否有任何价值? .NET?

Windows 会知道我正在等待 I/O 操作并在数据到达之前避免调度线程吗?

我记得在某处读过它,但恐怕我仍然难以理解它是如何工作的以及何时可以依赖它。

【问题讨论】:

  • 注意:我认为可能的缺点可能是必须检查聚合异常、任务开销等。
  • 我已经选择了一个答案,但我仍然很想知道是否有人可以解释一下操作系统和 CLI 如何协同工作以避免调度线程等待 I/O,并且会赞成可以通过详细信息积极确认的评论。

标签: c# .net asynchronous dotnet-httpclient


【解决方案1】:

不,在那里使用异步没有任何价值。正如您所怀疑的那样,Windows 会知道线程正在等待 IO,并且在数据到达之前不会调度线程。

但是,异步的想法是您实际上并不需要创建新线程。 async 的想法是(我在这里偷工减料;Internet 上有更好的文档可用)它尝试像您在此处手动执行的操作一样。因此,您不必创建一个新线程,async 会为您执行此操作。 (它实际上并没有创建一个新线程,但你明白了。)

如果这需要高性能,我不建议按照您现在实施的方式进行。异步会更好。在您的情况下,当您执行 1000 个请求时,您将拥有 1000 个线程,这不是一个好主意。异步会更智能地完成此任务,并为您提供更好的性能。

使用异步的基本优势(除了性能)是,它就像您实际上只在 UI 线程上进行编程一样。以前,这会锁定您的应用程序,但通过异步,您的应用程序将保持响应。这确实是异步的主要优势。

【讨论】:

  • 在这种情况下,我没有手动结束线程,它来自 IIS 或我们在 IIS 之上使用的框架。所以我认为这不是问题。
  • 你可能还好。此外,异步可能甚至无法正常工作(至少不是您所期望的那样),因为它更适用于 Windows/WPF/Metro 应用程序。
猜你喜欢
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 2018-12-01
  • 2011-09-04
相关资源
最近更新 更多