FTP上传在异步运行时不起作用,但在同步运行时起作用

本文关键字:运行时 同步 起作用 不起作用 异步 FTP | 更新日期: 2023-09-27 18:01:02

我正试图通过FTP上传一个文件,并希望向用户报告进度。我听从了这个建议,但没能成功。

如果我同步调用代码,它工作得很好。。。

  FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://myftpserver.com/test.zip");
  request.Credentials = new NetworkCredential("uid", "pwd");
  request.Method = WebRequestMethods.Ftp.UploadFile;
  using (FileStream inputStream = File.OpenRead(@"D:'test.zip")) {
    using (Stream outputStream = request.GetRequestStream()) {
      byte[] buffer = new byte[64 * 64];
      int totalReadBytesCount = 0;
      int readBytesCount;
      while ((readBytesCount = inputStream.Read(buffer, 0, buffer.Length)) > 0) {
        outputStream.Write(buffer, 0, readBytesCount);
        totalReadBytesCount += readBytesCount;
        int progress = (int)(totalReadBytesCount * 100.0 / inputStream.Length);
        Debug.WriteLine("  " + progress + "%");
      }
    }
  }

但是,如果我尝试将代码包装在BackgroundWorker中,它会悄无声息地失败。我试着在它周围添加了一个try/catch块,但没有出现异常。

这是BGW版本的代码。。。

  BackgroundWorker bg = new BackgroundWorker {
    WorkerReportsProgress = true
  };
  bg.DoWork += (s, e) => {
    try {
      Debug.WriteLine("DoWork");
      FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://myftpserver.com/test.zip");
      Debug.WriteLine("DoWork - Setting up creds");
      request.Credentials = new NetworkCredential("uid", "pwd");
      request.Method = WebRequestMethods.Ftp.UploadFile;
      using (FileStream inputStream = File.OpenRead(@"D:'test.zip")) {
        using (Stream outputStream = request.GetRequestStream()) {
          byte[] buffer = new byte[64 * 64];
          int totalReadBytesCount = 0;
          int readBytesCount;
          while ((readBytesCount = inputStream.Read(buffer, 0, buffer.Length)) > 0) {
            Debug.WriteLine("  DoWork - Inside");
            outputStream.Write(buffer, 0, readBytesCount);
            totalReadBytesCount += readBytesCount;
            double progress = totalReadBytesCount * 100.0 / inputStream.Length;
            Debug.WriteLine("  " + progress + "%");
            bg.ReportProgress((int)progress);
          }
        }
      }
    }
    catch (Exception ex) {
      Debug.WriteLine("Exception: " + ex.Message);
    }
  };
  bg.ProgressChanged += (s, e) => {
    Debug.WriteLine(e.ProgressPercentage + "%");
  };
  bg.RunWorkerCompleted += (s, e) => {
    Debug.WriteLine("Done");
  };
  bg.RunWorkerAsync();
}

我将"DoWork"行写入Output窗口,但没有其他内容。如果我在设置FtpWebRequest的行上放置了一个断点,那么执行会在该行之后立即结束,但不会出现异常。

有什么想法吗?可能是我做错了。我想上传async,并有一个进度指示器。这是最好的方法吗?

FTP上传在异步运行时不起作用,但在同步运行时起作用

如果它能帮助任何人,问题与上传代码无关,这很好。问题是,为了速度(或者我是这么认为的(,我在控制台应用程序中开发了这段代码。Main((方法调用了异步上传方法,然后退出。问题的原因是Main方法没有等到异步方法完成,所以执行被终止。

解决这个问题的快速而肮脏的方法是添加行。。。

Thread.Sleep(10000);

在调用async方法之后。然而,这需要猜测异步方法需要多长时间,和/或保持保守,并且必须等待更长的时间。

一种更好的方法,只需要等待所需的时间,可以在本线程中的IWolber的回答中看到。