簡體   English   中英

FTP上載在異步運行時不起作用,但在運行同步時起作用

[英]FTP upload not working when run async, but works when run sync

我正在嘗試通過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”行寫入了“輸出”窗口,但除此之外沒有其他。 如果我在設置FtpWebRequest的行上放置一個斷點,則執行會在該行之后立即結束,但是我不會遇到異常。

有任何想法嗎? 可能是我做錯了。 我想上傳異步,並有一個進度指示器。 這甚至是最好的方法嗎?

萬一它對任何人都有用,那么問題就與上傳代碼無關,這很好。 問題是,為了提高速度(或者我認為是這樣),我在控制台應用程序中開發了這段代碼。 Main()方法稱為異步上載方法,然后退出。 該問題的原因是Main方法沒有等到異步方法完成后才執行,因此終止了執行。

解決問題的快速而骯臟的方法是添加生產線。

Thread.Sleep(10000);

...在調用異步方法之后。 但是,這需要猜測異步方法將需要多長時間,和/或必須保守並且必須比必要的時間更長。

在IWolber在該線程中的答案中可以看到一種更好的方法,只需要等待就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM