我正在阅读这篇文章Limit the number of parallel threads in C#并试图用它同时通过ftp发送多个文件:
Perhaps something along the lines of:
ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = 4;
Then in your loop something like:
Parallel.Invoke(options,
() => new WebClient().Upload("http://www.linqpad.net", "lp.html"),
() => new WebClient().Upload("http://www.jaoo.dk", "jaoo.html"));
我正在尝试将目录中的文件添加到Invoke中,但我不确定如何添加它们:
var dirlisting = Directory.GetFiles(zipdir, "*.*", SearchOption.TopDirectoryOnly);
if (!dirlisting.Any())
{
Console.WriteLine("Error! No zipped files found!!");
return;
}
foreach (var s in dirlisting)
{
var thread = new Thread(() => FtpFile.SendFile(s));
thread.Start();
}
我不确定如何将它们添加到要发送的文件列表中。我只希望一次上升3。
如何为要发送的目录列表中的每个文件添加一个线程?
答案 0 :(得分:0)
沿着这些方向的东西应该可以解决问题
ParallelOptions o = new ParallelOptions();
o.MaxDegreeOfParallelism = 3;
Parallel.ForEach(dirlisting, o, (f) =>
{
Ftp.SendFile(f);
});
答案 1 :(得分:0)
Parallel.For
系列API用于CPU绑定任务。你在这里有IO绑定任务。理想情况下,您应该使用一些基于异步I / O Task
的API。
HttpClient
不支持FTP上传,但您可以使用FtpWebRequest.GetRequestStreamAsync
和Stream.WriteAsync
。您也可以使用WebClient.UploadFileAsync
,但是您需要为每个WebClient
创建一个新的UploadFileAsync
实例,因为WebClient
不支持并行执行多个操作实例
然后,您可以使用TPL数据流库或SemaphoreSlim
来限制并行度。例如,请检查"Throttling asynchronous tasks"。
答案 2 :(得分:0)
这些行对我有用。
var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 10 };
Parallel.ForEach(dirlisting, options, (item) =>
{
FtpFile.SendFile(item)
});