首页 > 解决方案 > 从给定目录中获取文件信息并处理N个文件以同时和顺序上传到服务器

问题描述

我需要一次处理 N 个文件,所以我已经将所有文件信息存储在Dictionarywith中Filename, Size, and SequenceNo,现在我必须从中选择 5 个文件Dictionary并处理该文件,同时如果任何文件的处理完成,那么它将选择另一个文件从那本词典。

例如 :

如果我在字典中有 10 个文件,我File 1, File 2, File 3, File 4, File 5从字典中选择前 5 个文件并处理它。如果进程File 3完成,则File 6应该启动进程。

所以帮助我。

谢谢你。

标签: c#dictionarygenericsuploadsftp

解决方案


谢谢,@netmage 我终于找到了ConcurrentBag用户的答案,所以我会发布我自己问题的答案。

有一个命名空间提供多个线程安全的集合类,即 System.Collections.Concurrent。我使用了该命名空间中的一个,即ConcurrentBag

List不同, ConcurrentBag包允许在我们对其进行迭代时进行修改。它也是线程安全的并允许对其进行并发访问。

我已经实现了以下代码来解决我的问题。

我已将ConcurrentBag对象FileData声明为全局。

ConcurrentBag<string[]> FileData = new ConcurrentBag<string[]>();

创建了一个函数来获取文件信息并将它们存储到FileData中。

private void GetFileInfoIntoBag(string DirectoryPath)
{
      var files = Directory.GetFiles(DirectoryPath, " *", SearchOption.AllDirectories);

      foreach (var file in files)
      {
            FileInfo f1 = new FileInfo(file);
            fileData = new string[4];
            fileData[0] = f1.Name;
            fileData[1] = GetFileSize.ToActualFileSize(f1.Length, 2);
            fileData[2] = Convert.ToString(i);
            fileData[3] = f1.FullName;
            i++;
            FileData.Add(fileData);
       }
}

然后在上传过程中,我根据需要创建了N个任务,并在其中实现了上传逻辑。

private void Upload_Click(object sender, EventArgs e)
{
    List<Task> tskCopy = new List<Task>();

    for (int i = 0; i < N; i++)
    {
        tskCopy.Add(Task.Run(() =>
        {
            while (FileData.Count > 0)
            {
                string[] file;
                FileData.TryTake(out file);
                if (file != null && file.Count() > 3)
                {
                   /* Upload Logic*/
                    GC.Collect();
                }
            }
        }));
    }

    Task.WaitAll(tskCopy.ToArray());
    MessageBox.Show("Upload Complited Successfully");
}

谢谢大家的支持。


推荐阅读