【问题标题】:How Can I Force Tasks to Start?如何强制任务开始?
【发布时间】:2012-08-24 04:15:49
【问题描述】:

我有一个扫描网络的程序,它通过使用大量等待数据从网络返回的任务(和并行 foreaches)来实现。问题是,虽然我知道这些任务几乎不使用任何 CPU 处理,但 CLR 并没有,而且它坚持要非常缓慢地启动(特别是因为它运行在两核 CPU 上)。

如何强制 CLR 同时启动更多任务?目前程序正在等待很多,我怎样才能让它同时打开更多的连接?

【问题讨论】:

  • 不确定这里的任务是否能给你带来任何好处;你正在等待 I/O
  • "当前程序正在等待很多" 您的源代码阻塞或 TPL 停止启动线程?您做了哪些工作来将问题缩小到 CLR?您是否有代码可以展示您可以发布的问题?
  • TPL 不会产生更多线程,它会卡在一个较低的数字上并缓慢上升。 @AndrewBarber,我认为任务应该替换所有 C# 代码中的线程,这是另一个抽象级别。

标签: c# concurrency task-parallel-library


【解决方案1】:

您可以使用不需要 TPL 的异步 IO 来启动新线程,也可以手动启动线程,也可以使用 ThreadPool.SetMinThreads。不要使用最后一个解决方案,因为这是一个进程范围的设置。不要为局部问题选择全局解决方案。

【讨论】:

  • 我们过去曾尝试过使用 SetMinThreads,我没有亲自使用,但项目中的其他人说它只是造成了麻烦。异步 IO 的问题是它不会阻塞当前线程,但最后这不是我想要的,我想同时执行单独的异步 IO 操作。
  • 我明白了。我建议您自己生成线程。您可以将构造函数中的堆栈大小设置为较低的值,这样您就可以毫无问题地生成 100 个线程。如果你想进入 1000 年代,你可能应该先测试一下(实际上可能工作得很好!)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 2020-06-07
  • 2011-08-25
  • 2017-08-24
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多