【发布时间】:2021-12-27 11:12:45
【问题描述】:
我想执行一个多次执行阻塞 I/O 操作(最多 67840 次调用)的库方法。该库不提供该方法的异步版本。
由于在大多数情况下调用只是等待超时,我想并行运行多个调用。我的方法是异步的,所以如果我能await 结果就好了。
由于 ThreadPool 不应该用于阻塞操作,我想执行以下操作:
- 启动多个线程(例如 1024)
- 在这些线程上运行阻塞调用
-
await完成(例如通过TaskCompletionSource)并在TheadPool上的正常任务中处理每个调用的结果
.NET 中是否有现有的类可以用来实现这样的目标?我知道TaskCreationOptions.LongRunning,但据我所知,这将为每个调用创建一个新线程。
【问题讨论】:
-
我不想告诉你,但是...“由于调用主要等待 I/O 操作完成,我想并行运行多个调用。”...运行多个操作并行不会增加可用的 IO。这正是并行调用无法使事情变得更快的场景,除非您调用一个时间确实可以并行扩展的 API(因为另一个调用使用,即后端的另一个线程/系统)。但是,如果您受 IO 限制,并行性实际上可能会使事情变得更慢。
-
我很抱歉,但您已经超时的事实表明 IO 过载。向问题抛出更多 IO 看起来并不是一个聪明的主意。
-
我怀疑框架对此有什么作用,因为它不是预期用途。对于 IO,您使用非阻塞 IO 调用,对于 CPU 工作,您不需要这么多线程。我的意思是在你的情况下你可能别无选择,但框架为这种情况提供解决方案会很奇怪。
-
@TomTom 假设您需要执行 10 个 Web 请求,但无论出于何种原因,您都不能使用异步 IO。然后并行执行肯定会比一个接一个地发出这些请求更快。
-
抱歉,问题涉及 IO 限制。对(可扩展)API 的 10 个 Web 请求没有 IO 限制。网络扫描不受设计的 IO 限制(带宽很大,ping/icmp 数据包非常小),所以我评论的问题在描述中是 TOTALLY OFF,就这么简单。
标签: c# .net multithreading async-await .net-4.7.2