"(501)参数或参数中的语法错误"从多个并行后台线程使用FtpWebRequest时

时间:2016-09-03 12:00:58

标签: c# multithreading ftp

我只是想下载' n'同时使用ftp服务器的文件。我的代码如下......

每次运行此代码时,只会下载一个文件,然后在GetResponse()行中引发异常:

  

远程服务器返回错误:(501)参数或参数中的语法错误。

class main{
public static void main(){ 
    Multiple_File_Downloader MFD= new Multiple_File_Downloader();
      MFD.Multi_Thread();  }
  }
    class Multiple_File_Downloader
    { 
      public void Multi_Thread()
        {
            Thread a = new Thread(new ThreadStart(() => Downloadfile("7.jpg")));
            Thread b = new Thread(new ThreadStart(() => Downloadfile("8.jpg")));

            a.IsBackground = true;
            b.IsBackground = true;

            a.Start();
            b.Start();
            }

        public void Downloadfile(string _filename)
        {
            string localPath = @"E:\FTPTrialPath\";

    FtpWebRequest requestFileDownload = (FtpWebRequest)WebRequest.Create("ftp://url/" + _filename);
            requestFileDownload.Credentials = new NetworkCredential("Login","password");
            requestFileDownload.Method = WebRequestMethods.Ftp.DownloadFile;
            requestFileDownload.UsePassive =  true;

    using(FtpWebResponse  responseFileDownload = (FtpWebResponse)requestFileDownload.GetResponse()) //<<< ERROR HERE...
        {
                Stream responseStream = responseFileDownload.GetResponseStream();
                FileStream writeStream = new FileStream(localPath + _filename, FileMode.Create);

                int Length = 2048;
                Byte[] buffer = new Byte[Length];
                int bytesRead = responseStream.Read(buffer, 0, Length);

                while (bytesRead > 0)
                {
                    writeStream.Write(buffer, 0, bytesRead);
                    bytesRead = responseStream.Read(buffer, 0, Length);
                }
      }
                requestFileDownload = null;
      }
    }

是否可以在不干扰其他线程参数的情况下这样做? 感谢Advance中的帮助:)

2 个答案:

答案 0 :(得分:0)

每次调用方法时,它都有自己的一组参数,这些参数仅适用于该方法调用。

除非你

  • 通过引用传递内容(使用ref keyword
  • 传递引用类型(例如类)
  • 传递包含引用类型的值类型(即包含类的结构)
  • 修改全局变量(例如类级别变量)

...在多个线程中运行相同的方法没有问题。

在您的代码中,您创建了两个不同的字符串,这些字符串只能由&#34;方法实例访问&#34;你把它传给了。

答案 1 :(得分:0)

您的问题与并发访问无关。您的代码完全是线程安全的。

我看到两个可能的问题:

  1. 您不必等待线程完成。您的申请突然中止。例外可能只是该中止的副作用。

    使用Thread.Join等待线程在Multi_Thread方法结束时完成:

    a.Join();
    b.Join();
    
  2. 由于缺少可用端口,服务器可能会出现多个并行传输问题。您是否使用独立的FTP客户端测试来自同一服务器的并行传输?