2011-03-12 40 views
1

我有一个关于线程和后台工作人员的问题,我希望你能帮忙。关于线程/后台工作者的问题

我打算让ftp应用程序将文件上传到50台服务器。在下一次开始之前,用户不必等待每次上传完成,而是在寻找线程/后台工作人员。一旦上传完成,我想报告上传“已完成/失败”的状态返回到用户界面。根据我的理解,我需要为此使用后台工作人员,以便我知道任务何时完成。我知道线程我可以使用生产者/消费者队列或信号量一次运行给定数量的线程,但我不太清楚我如何能够实现这一点与地面工作人员。

所以我的问题是,控制上传立即运行的后台工作人员的数量是多少,以及其他排队的最佳方法是什么?

上传文件的大小没有限制,所以这可能会很小或者最高达几MB。

在此先感谢。

编辑 - 我为每个运行同步的服务器测试了一个背景工作。结果比单个背景工作者要快,但我不能说我对于同时运行50多位后台工作人员非常舒适,而且由于服务器数量未来可能会增加,所以我决定坚持使用一个,似乎足够快。我将来可能会将工人数量增加到2或3人,但目前1似乎已经足够。感谢大家的帮助。

谢谢

回答

1

这比使用信号灯或生产者 - 消费者队列容易得多。

把你所有的任务队列(不必是线程安全的队列,它只会从UI线程中使用)。

从1到循环N,取出一个任务并启动BackgroundWorker。 (当有少于N个任务时,务必处理空队列)。在RunWorkerCompleted事件中,更新您的用户界面,取消另一项任务,并启动另一个BackgroundWorker

+0

嗨本,我决定用这种方法我用一个单一的背景工人在同一时间运行的应用程序。感谢fedor333的帮助 – fedor333 2011-03-28 10:13:18

1

这里的瓶颈将是你的网络带宽。如果您的本地上游连接速度如此之快以至于您可以在两台或多台远程主机上使传入连接饱和,那么您将从并行运行多个上传中受益。如果不是,那么它对总上传时间没有什么影响,因为它将由(文件大小*上传数量)/(本地带宽)决定。换句话说 - 如果你一次上传一个,则需要一个小时;如果你并行上传20个,它仍然需要一个小时。第一种方法的优点是,如果您失去连接性,您只需要恢复/重新启动一次上载 - 无论连接丢失时是否正在进行。

因此,我会使用单个后台线程依次将文件依次上传到每个服务器。如果您使用.NET BackgroundWorker来执行此操作,则可以在每个文件的末尾将其获取到ReportProgress(并且事先知道要上传多少个文件,以便可以按百分比计算进度),并附加进度更新的一些自定义状态以通知用户上次上传是否成功。

+0

嗨迪伦 - 我决定使用一个后台工作如你所说 - 由于fedor333 – fedor333 2011-03-28 10:14:37

2

我会用一个完全不同的方向,tbh。你的应用程序应该获取文件并存储一次,并回应客户端获取它。该文件应该传播到其他服务器。你可以用很多方法做到这一点,但是如果你想让它由同一个应用程序控制(也就是说没有使用windows服务或类似的东西),那么一个好方法就是使用消息队列(MSMQ或者其中一个OS) 。

1

确切知道的唯一方法是测试和测量,但它可能因机器而异,主要取决于上行速度。

同时启动50个背景工作者在高端位置上有一点点,但并不令人难以置信。一个简单的方法是同时启动50个所有内存并测量内存消耗和上传速度。

如果FTP服务器是比客户端上行速度最有效的将是只需上传一次在一个(或可能二)各快得多。