如何在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个。

如何为要发送的目录列表中的每个文件添加线程?

如何在foreach循环中添加并行列表

这几行应该可以达到效果

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.GetRequestStreamAsyncStream.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)
});