我正在构建一个Windows控制台应用程序,在对文件执行逻辑后,它们通过FTP单独传输(我们在这里处理数千个文件) 这些文件相对较小(约50kb),因此FTP功能的登录,传输和注销确实需要相当长的时间,特别是在与1000个文件相乘时。
FTP服务器不能接受多于(例如)10个同时连接。
我有几个想法是什么是最好的行动方案:
任何人都可以帮助我建立这些想法,或者建议更好的建议吗?
提前致谢!
答案 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)
您可以使用线程执行此操作。 ThreadPool类是一个很好的起点。
https://msdn.microsoft.com/en-us/library/6kac2kdh(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/system.threading.threadpool(v=vs.110).aspx
答案 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