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

时间:2014-05-26 21:30:31

标签: c# ftp parallel-processing asp.net-4.5

我正在阅读这篇文章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。

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

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