【发布时间】:2011-10-11 10:07:40
【问题描述】:
我的应用程序使用BackgroundWorker 将文件上传到 FTP 服务器。
一切正常,但似乎OnProgressChanged 事件没有按应有的方式工作。
虽然OnProgressChanged 将在RunWorkerCompleted 事件触发后完全完成,但事实并非如此。
就我而言,OnProgressChanged 事件仍在触发,尽管RunWorkerComplete 已触发。显然,当我的文件已经完全发送到 ftp 服务器时,我的进度条仍在继续。
我在调试模式下进行了测试,发现RunWorkerCompleted Fired 后,OnPorgressChanged 仍在工作。
我的代码在这里。
void FTP_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bw = sender as BackgroundWorker;
try
{
string filename = e.Argument.ToString();
if (filename != string.Empty)
{
FileInfo fileInf = new FileInfo(filename);
FtpWebRequest reqFTP;
if (!IsFolderExist(_defaultDir))
{
MakeDefaultDir(_defaultDir);
}
reqFTP = GetRequest(this._host, this._port, GetDirName(_defaultDir) + "/" + fileInf.Name, this._user, this._pass);
reqFTP.KeepAlive = false;
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP.UseBinary = true;
reqFTP.ContentLength = fileInf.Length;
long FileSize = fileInf.Length;
string FileSizeDescription = GetFileSize(FileSize);
int ChunkSize = 4096, NumRetries = 0, MaxRetries = 50;
long SentBytes = 0;
byte[] Buffer = new byte[ChunkSize];
int BytesRead = 0;
using (Stream requestStream = reqFTP.GetRequestStream())
{
using (FileStream fs = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
BytesRead = fs.Read(Buffer, 0, ChunkSize); // read the first chunk in the buffer
while (BytesRead > 0)
{
try
{
if (bw.CancellationPending)
return;
requestStream.Write(Buffer, 0, BytesRead);
SentBytes += BytesRead;
// Here is progress information
string SummaryText = String.Format("Transferred {0} / {1}", GetFileSize(SentBytes), FileSizeDescription);
bw.ReportProgress((int)(((decimal)SentBytes / (decimal)FileSize) * 100), SummaryText);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.ToString());
if (NumRetries++ < MaxRetries)
{
fs.Position -= BytesRead;
}
else
{
throw new Exception(String.Format("Error occurred during upload, too many retries. \n{0}", ex.ToString()));
}
}
BytesRead = fs.Read(Buffer, 0, ChunkSize);
}
}
}
}
}
catch (Exception ex)
{
if (OnFTPError != null)
{
OnFTPError(this, "Error was handled in Replaced File Uploading :" + ex.Message);
}
}
}
对这个问题有什么想法吗? 谢谢大家
【问题讨论】:
-
这不应该发生。请显示一些代码。
-
有没有可能后来 OnProgressChanged 的提升实际上发生得更早,但是由于主线程忙于其他事情,所以在主线程上被批量处理为消息?
-
@Polity 我对此不确定。但就我而言,在 RunWorkerCompleted 被解雇之前我什么都不做。因此,在这种情况下,我的状态已完全发送,但我的进度条仍在移动。
-
您的代码会生成多少个 Progress 事件?应该不会超过 100。如果是数万,那么 @Polly 的场景是有道理的。
-
我确定它不会产生超过 100 个事件
标签: c# progress-bar backgroundworker