C# 调度员、后台工作人员还是并行人员?

C# 调度员、后台工作人员还是并行人员?,c#,multithreading,visual-studio-2010,httpwebrequest,C#,Multithreading,Visual Studio 2010,Httpwebrequest,作为尝试学习C#的一部分,我正在编写一个小应用程序,它将遍历一系列代理。对于每个代理,它将创建一个到proxytest.php的httpwebrequest,该proxytest.php打印关于给定代理的通用数据(或者不打印,在这种情况下,该代理将被丢弃) 显然,webrequest代码需要在一个单独的线程中运行——特别是因为我计划浏览相当大的列表。但是,即使在一个单独的线程上,通过5000个代理也会花费很长时间,所以我认为这意味着我要创建多个线程(如果我错了,请纠正我) 我浏览了MSDN和随机

作为尝试学习C#的一部分,我正在编写一个小应用程序,它将遍历一系列代理。对于每个代理,它将创建一个到proxytest.php的httpwebrequest,该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个独立的背景工作者这样的工作有什么不同

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


谢谢

我想说的是使用任务并行库。这是一个新的库,它包含了您必须编写的所有手动线程代码

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

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


我想使用任务并行库。这是一个新的库,它包含了您必须编写的所有手动线程代码

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

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

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

是线程上的便利类,该线程是的一部分。它的存在是为了提供一些通常要求的功能,而不是通过手动将工作分配给线程池

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

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

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

是线程上的便利类,该线程是的一部分。它的存在是为了提供一些通常要求的功能,而不是通过手动将工作分配给线程池

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


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

看看这个,更概括地说:看看这个,更多总结:对于OP中的示例代码段,Parallel.ForEach是否会为URLsList中的每个条目创建一个线程?这不是一个问题吗?@Vlad:No,因为a)它使用托管线程池(因此通常不会创建线程;休眠线程只是被唤醒)和b)它最多只使用指定数量的线程(
maxDegreeofparalElism=…
)。TPL不能保证总是提高性能,也不总是最佳的方法,TPL可能会影响性能的情况有很多,强烈建议您分析一下TPL是否真的有帮助。@Rohitharma:这里没有人提到性能,所以我看不出您的评论有什么关系。但无论如何,与任何不使用线程池的解决方案相比,它肯定会有更好的性能,假设线程池同时没有其他压力。@Jon,我有,不是故意挑剔,我只是想强调vlad正在学习c#中的线程-这个例子只是他的测试,从你的回答来看,他最终可能会应用相同的应用程序