有没有办法多次执行一个方法,但管理连接/线程?(.净)

Jad*_*ias 2 .net connection parallel-processing multithreading

  1. 我有一个使用连接的方法(例如下载页面的方法).
  2. 我必须多次执行此方法(例如下载1000页).
  3. 以同步和顺序方式执行此操作需要很长时间.
  4. 我的资源有限(8个最大线程和/或50个最大同时连接)
  5. 我想用所有资源来加速它.
  6. 我知道并行化(PLINQ,Parallel Extensions等)可以解决这个问题,但我已经尝试过了,而且由于资源稀缺,这种方法失败了.
  7. 我不想在管理资源时重新发明并行化这种任务的轮子,有人必须在此之前完成它并且必须为此提供库/教程.

有人可以帮忙吗?

当您开始将异步调用与Parallelization混合以获得最佳性能时,更新事情会变得复杂得多.这是在几个下载器上实现的,比如Firefox下载器,它同时获得2次下载,当其中一个完成时,它会获得下一个文件,依此类推.也许它似乎很容易实现,但是当我实现它时,我已经并且仍然有麻烦使它成为通用的(对WebRequest和DbCommand有用)并处理问题(即超时)

赏金猎人赏金将被授予第一个链接可靠和免费($$).NET库的赏金,它提供了一种简单的C#方式来并行化异步任务,如HttpWebRequests.BegingetResponse和SqlCommand.BeginExecuteNonQuery.并行化不能等待N个任务完成然后启动下一个N,但是一旦N个初始任务中的一个完成,它必须立即开始新任务.该方法必须提供超时处理.

toa*_*oad 5

查看连接的计数信号量. http://en.wikipedia.org/wiki/Semaphore_(programming)

编辑:要回答您的评论,.NET Framework已经有了.http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx


Cha*_*pol 5

您能否提供更多有关Parallel Linq无法工作的信息?

我的观点是,你的任务最适合PLinq.如果您在8核计算机上运行,​​PLinq将拆分为8个任务,并为您排队所有剩余的任务.

这是草案代码,

PagesToDownload.AsParallel().ForAll(DownloadMethodWithLimitConnections);
Run Code Online (Sandbox Code Playgroud)

我不明白为什么PLinq消耗你的资源.根据我的测试,PLinq性能甚至比使用ThreadPool更好.