如何设置动态数量的threadCounter变量?

时间:2011-07-26 09:11:49

标签: c# multithreading

我不是真的进入多线程,所以可能问题是愚蠢的,但似乎我找不到解决这个问题的方法(特别是因为我使用C#而且我已经使用它一个月了。)

我有一个动态数量的目录(我从数据库中的查询中获取了它)。在这些查询中,有一定数量的文件。

对于每个目录,我需要使用一种方法以cuncurrent方式使用FTP传输这些文件,因为我对FTP最大连接基本上没有限制(不是我的话,它是在具体内容中写的)。

但是我仍然需要控制每个目录传输的最大文件数量。所以我需要计算我正在传输的文件(递增/递减)。

我怎么能这样做?我应该使用类似数组的东西并使用 Monitor 类吗?

修改:框架 3.5

2 个答案:

答案 0 :(得分:1)

您可以使用Semaphore类来限制每个目录的并发文件数。您可能希望每个目录有一个信号量,以便每个目录的FTP上载数量可以独立控制。

public class Example
{
  public void ProcessAllFilesAsync()
  {
    var semaphores = new Dictionary<string, Semaphore>();
    foreach (string filePath in GetFiles())
    {
      string filePathCapture = filePath; // Needed to perform the closure correctly.
      string directoryPath = Path.GetDirectoryName(filePath);
      if (!semaphores.ContainsKey(directoryPath))
      {
        int allowed = NUM_OF_CONCURRENT_OPERATIONS;
        semaphores.Add(directoryPath, new Semaphore(allowed, allowed));
      }
      var semaphore = semaphores[directoryPath];
      ThreadPool.QueueUserWorkItem(
        (state) =>
        {
          semaphore.WaitOne();
          try
          {
            DoFtpOperation(filePathCapture);
          }
          finally
          {
            semaphore.Release();
          }
        }, null);
    }
  }
}

答案 1 :(得分:0)

var allDirectories = db.GetAllDirectories();
foreach(var directoryPath in allDirectories)
{
    DirectoryInfo directories = new DirectoryInfo(directoryPath);
    //Loop through every file in that Directory
    foreach(var fileInDir in directories.GetFiles()) {
        //Check if we have reached our max limit
        if (numberFTPConnections == MAXFTPCONNECTIONS){
            Thread.Sleep(1000);
        }

        //code to copy to FTP
        //This can be Aync, when then transfer is completed
        //decrement the numberFTPConnections so then next file can be transfered.
     }
 }

您可以尝试上面的内容。请注意,这只是基本逻辑,并且有更好的方法可以做到这一点。