Мое приложение использовало 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);
}
}
}
Есть идеи по этому вопросу?
Спасибо, ребята