如何在foreach循环中添加并行列表
本文关键字:添加 并行 列表 循环 foreach | 更新日期: 2023-09-27 18:05:20
我正在阅读这篇文章限制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"));
我正试图将我的目录中的文件添加到调用,但我不确定如何添加它们:
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个。
如何为要发送的目录列表中的每个文件添加线程?
这几行应该可以达到效果
ParallelOptions o = new ParallelOptions();
o.MaxDegreeOfParallelism = 3;
Parallel.ForEach(dirlisting, o, (f) =>
{
Ftp.SendFile(f);
});
Parallel.For
系列api用于cpu绑定任务。这里有io绑定的任务。理想情况下,您应该使用一些基于异步I/O Task
的API。
HttpClient
不支持FTP上传,但可以使用FtpWebRequest.GetRequestStreamAsync
和Stream.WriteAsync
上传。你也可以使用WebClient.UploadFileAsync
,但是你需要为每个UploadFileAsync
创建一个新的WebClient
实例,因为WebClient
不支持在同一个实例上并行执行多个操作。
然后你可以使用TPL数据流库或SemaphoreSlim
来限制并行度。例如,选中"Throttling asynchronous tasks"
这些行对我来说很有用。
var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 10 };
Parallel.ForEach(dirlisting, options, (item) =>
{
FtpFile.SendFile(item)
});