C#Downloader:我应该使用Threads,BackgroundWorker还是ThreadPool?

我正在用C#编写一个下载程序并停止了以下问题:我应该使用什么样的方法来并行化我的下载并更新我的GUI?

在我的第一次尝试中,我使用了4个线程,并且在每个线程完成时我开始了另一个:主要问题是我的cpu在每个新线程启动时都是100%。

谷歌搜索,我发现BackgroundWorker和ThreadPool的存在:说我想用我正在下载的每个链接的进度更新我的GUI,什么是最好的解决方案?

1)创建4个不同的BackgroundWorker,附加到每个ProgressChanged事件,委托GUI中的函数来更新进度?

2)使用ThreadPool并将最大和最小线程数设置为相同的值?

如果我选择#2,当队列中没有更multithreading时,是否会停止4个工作线程? 它暂停了吗? 由于我必须下载不同的链接列表(每个链接20个链接)并在完成一个链接时从一个链接移动到另一个链接,ThreadPool是否在每个列表之间启动和停止线程?

如果我想在live上更改工作线程的数量并决定使用ThreadPool,从10个线程更改为6,它是否会抛出exception并停止4个随机线程?

这是让我头疼的唯一部分。 我提前感谢你们每个人的答案。

我认为您应该考虑使用任务并行库 ,它是.NET 4中的新增function,旨在解决这些类型的问题

拥有100%的CPU负载与下载无关(因为您的网络几乎总是瓶颈)。 我会说你必须检查你的逻辑如何等待下载完成。

你可以多次发布一些线程代码的代码吗?

通过创建4个不同的后台工作人员,您将创建不再干扰GUI的单独线程。 背景工作者很容易实现,从我的理解将完全按照你的需要去做。

就个人而言,我会这样做,只是让其他人不能开始,直到前一个完成。 (或者可能只有一个,并允许它以正确的顺序一次执行一个方法。)

仅供参考 – Backgroundworker