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,并有一个进度指示器。这是最好的方法吗?
如果它能帮助任何人,问题与上传代码无关,这很好。问题是,为了速度(或者我是这么认为的(,我在控制台应用程序中开发了这段代码。Main((方法调用了异步上传方法,然后退出。问题的原因是Main方法没有等到异步方法完成,所以执行被终止。
解决这个问题的快速而肮脏的方法是添加行。。。
Thread.Sleep(10000);
在调用async方法之后。然而,这需要猜测异步方法需要多长时间,和/或保持保守,并且必须等待更长的时间。
一种更好的方法,只需要等待所需的时间,可以在本线程中的IWolber的回答中看到。