[英]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.