同时运行相同的功能

时间:2017-05-12 18:17:03

标签: c# visual-studio ftp coroutine

我正在构建一个Windows控制台应用程序,在对文件执行逻辑后,它们通过FTP单独传输(我们在这里处理数千个文件) 这些文件相对较小(约50kb),因此FTP功能的登录,传输和注销确实需要相当长的时间,特别是在与1000个文件相乘时。

FTP服务器不能接受多于(例如)10个同时连接。

我有几个想法是什么是最好的行动方案:

  1. 我是Unity3D程序员,Coroutines听起来像是处理这个问题的完美方式。 只需循环启动协同程序(增加一个变量ActiveConnections),然后等待ActiveConnections变为> 10并重复该过程。协同程序中的协同程序是否可行?我没有运气...
  2. 仅为FTP连接启动另一个进程/应用程序,为每个文件创建和销毁此控制台应用程序。问题是A,它不是很有效(当然)和B.我如何管理主程序中ActiveConnections var中存储的Active连接数量?
  3. 任何人都可以帮助我建立这些想法,或者建议更好的建议吗?

    提前致谢!

3 个答案:

答案 0 :(得分:1)

并行linq可能适合你。

List<FileInfo> filesToTransfer = GetFiles().AsParallel().WithDegreeOfParallelism(10);
filesToTransfer.ForAll(Transfer());

这只是我拼凑的一些代码,Transfer()函数是您坚持登录,传输和注销功能的地方。更多信息请参见以下链接。

https://msdn.microsoft.com/en-us/library/dd460688(v=vs.110).aspx

答案 1 :(得分:1)

答案 2 :(得分:1)

您可以通过线程完成此操作。如果你从未做过任何多线程,我推荐C#黄皮书:www.csharpcourse.com。在第166页的C#中有一个很好的多线程介绍。

我不熟悉如何实现协程的细节,但通常在内存中存储一​​堆函数调用和相关的局部变量不能很好地扩展,对于你将成千上万的应用程序来说不是一个好主意电话。

这里的真正问题是每次运行单个文件传输时必须登录所引入的开销。即使您成功打开了十个并发连接,您也只会同时执行十倍的低效操作。

我建议你做的是提供一种方法来安排文件传输,并在一次连接期间发送许多文件进行批量传输。如果您使用的是System.Net,则可以在每个请求上设置一个标志,如下所示:Upload Multiple files to FTP in c#

如果你真的想要全力以赴,这可能是学习和应用生产者 - 消费者设计模式的完美候选者。在您的应用程序中,您可以让一个活动线程运行并执行它需要对文件执行的任何操作,另一个正在查看这些已完成文件并将其上载到服务器。

https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem