Dispatcher,BackgroundWorker还是Parallel?

时间:2011-12-03 00:36:44

标签: c# multithreading visual-studio-2010 httpwebrequest

作为尝试学习C#的一部分,我正在编写一个通过代理列表的小应用程序。对于每个代理,它将为proxytest.php创建一个httpwebrequest,它打印有关给定代理的通用数据(或者不会,在这种情况下代理被丢弃)

显然,webrequest代码需要在一个单独的线程中运行 - 特别是因为我计划通过相当大的列表。但即使在一个单独的线程上,经过5000个代理也需要永远,所以我认为这意味着我要创建多个线程(如果我错了就纠正我)

我查看了MSDN和随机线程教程,并提供了几个不同的类。调度员,后台工作者和并行员之间有什么区别?我得到了这个片段:

Parallel.ForEach(URLsList, new ParallelOptions() { MaxDegreeOfParallelism = S0 }, (m, i, j) =>
  {
    string[] UP = m.Split('|');
    string User = UP[0];
    string Pass = UP[1];
 // make call here
 }

我不确定它与启动5个独立的背景工作者会有什么不同。

那么这三者之间有什么区别?这个问题的好(简单)方法是什么?

由于

2 个答案:

答案 0 :(得分:3)

Dispatcher是一个对WPF应用程序的消息循环建模的对象。如果这对你没有任何意义,那就忘记你曾经听过它。

BackgroundWorker是作为managed thread pool一部分的线程的便利类。它存在以提供一些常见的功能,而不是使用ThreadPool.QueueUserWorkItem手动将工作分配给线程池。

Thread类与使用托管线程池非常相似,区别在于您完全控制线程的生命周期(另一方面,如果您打算使用线程池,则比使用线程池更糟糕发起许多短期任务。)

Task Parallel Library(TPL)(即使用Parallel.ForEach)确实是最好的方法,因为它不仅负责将工作单元分配给多个线程(来自托管线程池)但它也会自动将工作单位划分为这些线程。

答案 1 :(得分:1)

我会说使用任务并行库。它是一个围绕所有手动线程代码的新库,否则你将不得不写。

  

任务并行库(TPL)是一组新类,专门设计用于在现代硬件上执行非常细粒度的并行工作负载,从而更轻松,更高效。 TPL已经作为CTP单独提供了一段时间,并且包含在Visual Studio 2010 CTP中,但在这些版本中,它是基于自己的专用工作调度程序构建的。对于CLR 4.0的Beta 1,TPL的默认调度程序将是CLR线程池,它允许TPL样式的工作负载与现有的基于QUWI的代码“玩得很好”,并允许我们重用大部分底层技术。线程池 - 特别是线程注入算法,我们将在以后的文章中讨论。

http://blogs.msdn.com/b/ericeil/archive/2009/04/23/clr-4-0-threadpool-improvements-part-1.aspx

我发现使用这个新的4库真的很容易。这篇博客展示了旧的BackgroundWorker做事方式和新的Task做事方式。

http://nitoprograms.blogspot.com/2010/06/reporting-progress-from-tasks.html