Dispatcher, BackgroundWorker or Parallel?

本文关键字:Parallel or BackgroundWorker Dispatcher | 更新日期: 2023-09-27 18:16:26

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

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

我看了MSDN和随机线程教程,有几个不同的类可用。dispatcher, backgroundworker和parallel之间有什么区别?我得到了这样的代码片段:

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个单独的后台工作程序有什么不同。

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

谢谢

Dispatcher, BackgroundWorker or Parallel?

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

BackgroundWorker是托管线程池中线程上的一个便利类。它的存在是为了提供一些常用的功能,而不是使用ThreadPool.QueueUserWorkItem手动将工作分配给线程池。

Thread类非常类似于使用托管线程池,不同之处在于您可以绝对控制线程的生命周期(另一方面,如果您打算启动大量短任务,它比使用线程池更糟糕)。

任务并行库(TPL)(即使用Parallel.ForEach)确实是最好的方法,因为它不仅负责将工作单元分配给许多线程(来自托管线程池),而且还会在这些线程之间自动划分工作单元。

我会说使用任务并行库。它是一个新的库,可以解决你必须编写的所有手动线程代码。

任务并行库(Task Parallel Library, 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 -改进- - 1.部分aspx

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

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