所以 . 我有一个爬网的例程 . 该例程以IP列表播种,并跟踪在爬行设备时找到的IP . 当它找到新的IP时,它也会抓取它们 .
这是我的问题 . 我在一个并行的foreach中运行种子IP的初始扫描,并且还在平行的foreach中启动我在每个设备上找到的IP,因此我最终会产生10个线程,每个线程产生10个线程,总共100个线程(或更多)如果那些线程找到自己的设备) . 我想限制整个过程使用的线程总数(比如说25) .
可以在C#的任务库中完成吗?
我知道foreach循环上的MaxDegreeOfParallelism属性,但它可以共享吗?
2 回答
特工Shark的回答就是这个伎俩 . 我想我会分享我的工作实例,并讨论我遇到的一些事情 .
起初,我使用嵌套的Parallel.ForEach循环 . 但是我想到,如果我将线程/任务计数限制为小于第一个循环中的总数,那么就没有线程来处理第二个循环,因此例程永远不会完成 . 所以这根本不起作用 .
这让Agent Shark想到了一个共享队列的想法,你可以把任务推到那个就可以在线程被释放时运行 .
这是我的解决方案的样子 .
如何将这些任务推送到共享任务工厂? How to: Create a Task Scheduler That Limits Concurrency