C# C使用并行任务从FTP多次下载-重复下载问题

C# C使用并行任务从FTP多次下载-重复下载问题,c#,ftp,parallel.foreach,C#,Ftp,Parallel.foreach,我面临一个奇怪的问题,我想从FTP下载一个文件列表。我更喜欢并行任务。下面是我的代码。问题是,所有文件列表都已下载,但会生成具有不同名称的重复文件。我对并行任务的概念非常陌生。请帮我找出问题所在 注意:我使用SSH.Net进行sftp连接和下载 private void ConcurrentDownload() { // Declaring Connection Information PasswordAuthenticationMethod pm

我面临一个奇怪的问题,我想从FTP下载一个文件列表。我更喜欢并行任务。下面是我的代码。问题是,所有文件列表都已下载,但会生成具有不同名称的重复文件。我对并行任务的概念非常陌生。请帮我找出问题所在

注意:我使用SSH.Net进行sftp连接和下载

    private void ConcurrentDownload()
    {
        // Declaring Connection Information
        PasswordAuthenticationMethod pm = new PasswordAuthenticationMethod("FTPUserName", "Password");
        ConnectionInfo connectionInfo = new ConnectionInfo("FTPHost", 22, "FTPUserName", ProxyTypes.Socks5, "127.0.0.1", 8080, string.Empty, string.Empty, pm);

        using (SftpClient sfc = new SftpClient(connectionInfo))
        {
        // Establish the remote connection
        sfc.Connect();

        // Getting Remote Directory Contents
        IEnumerable<SftpFile> sFiles = new List<SftpFile>();    
        sFiles = sfc.ListDirectory(".\\");

        // Building the File List                
        List<string> remotefiles = new List<string>();
        foreach (SftpFile sfile in sFiles)
        {
         if (!sfile.IsDirectory)
         {
           string ss = sfile.Name;
           remotefiles.Add(ss);
         }
        }

        // Parallel Download
        Parallel.ForEach(remotefiles.Distinct(), file => DownloadFile(sfc, file)); 
        sfc.Disconnect();
        }
    }

   private void DownloadFile(SftpClient sf, string RemoteFileName)
   {
        using (Stream ms = File.OpenWrite(RemoteFileName))
        {
            sf.DownloadFile(RemoteFileName, ms);
        }
   }
你最好像下面这样使用Distinct

Parallel.ForEach(remotefiles.Distinct(), file => DownloadFile(sfc, file)); 
如果您有重复的文件名,并且当并行处理在同一个文件上启动时,您将在这些重复的文件上获得异常

而且,您并没有下载到其他位置,您所做的是下载到相同的ftp源位置。对吗

我会给出不同的下载目录,从源文件中获取文件名,然后下载到那个位置,如下所示

    private void DownloadFile(SftpClient sf, string RemoteFileName)
    {
        string downloadTo = Path.Combine(DownloadDirectoryPath, Path.GetFileName(RemoteFileName));
        using (Stream ms = File.OpenWrite(downloadTo))
        {
            sf.DownloadFile(RemoteFileName, ms);
        }
    }

相关参考:

remoteFiles中有什么?现在,它是一个空的集合。您确定填充时该列表中没有重复的项目吗?@xxbbxx remotefiles是一个列表,我非常确定,其中没有重复的文件名。我没有得到重复的文件名,在不同的文件名中得到重复的流。抱歉没有提及。SftpClient和下载文件是线程安全的吗?我找不到任何东西说他们是。在这种情况下,这可以解释您看到的行为。Hi@Damith,RemoteFile不会携带重复的文件名。问题在于我希望的线索。在Parallel.ForEach中,它将错误的流下载到不同的文件名中。例如:我想同时从服务器下载ABC.XLSX和XYZ.XLSX文件。我得到的输出为ABC.XLSX和XYZ.XLSX,内容相同/有时内容正确/有时内容互换。remotefiles是一个列表,我非常确定,其中没有重复的文件名。我没有得到重复的文件名,我得到的是不同文件名中的重复流。很抱歉没有提到这一点。请尝试在DownloadFile方法中创建SftpClient,不要共享同一个“SftpClient”。如果SftpClient不支持并行,则此方法将失败。如果我在下载文件中创建SftpClient,则它将与服务器建立多个连接,我假设在该服务器上建立单个连接并下载多个文件。@ShankarChandrasekaran则并行运行没有意义