C# Background Worker Issue
У меня есть программа, которая загружает файл, а затем заменяет старый на компьютере под управлением Windows.
У меня есть два фоновых рабочих, которые запускаются всякий раз, когда нажимают кнопку для загрузки файла. Один фоновый работник отвечает за фактическую загрузку SFTP нового файла. Другой фоновый работник просто читает размер загруженного файла каждую секунду, чтобы определить ход загрузки.
Проблема, с которой я столкнулся, заключается в том, что на половине машин прогресс загрузки не отображается. Загрузка все еще продолжается, хотя. Я не могу понять, почему при запуске одной и той же программы на двух компьютерах прогресс загрузки будет отображаться на одном компьютере, но не будет отображаться на другом.
// This thread will handle monitoring the downloaded BioR.mdb file size
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker; // necessary
do // continue reporting file size until the file has finished downloading
{
Thread.Sleep(1000); // report once per second
long file_size = new FileInfo(@"C:\BioERemote\BioR.mdb").Length; // get file size
worker.ReportProgress(Convert.ToInt32(file_size)); // "worker" reports the file size to ProgressChanged event
} while (!is_complete); // is_complete becomes true when backgroundworker2 completes the download
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
label2.Text = Convert.ToString(Math.Round((Convert.ToDouble(e.ProgressPercentage) / Convert.ToDouble(remote_size)) * 100.0, 2)) + "% Downloaded";
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
label2.Text = "";
}
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
using (var client = new SftpClient(sftp_address, sftp_username, sftp_password))
{
client.Connect();
DownloadDirectory(client, bioe_remote_source, local_remote_destination);
client.Disconnect();
}
is_complete = true;
}
private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
label_Status.ForeColor = Color.Green;
label_Status.Text = "Completed! You may use Remote.";
}
2 ответа
Иван Стоев получил ответ. Мне нужно было поместить оператор try catch в мой оператор FileInfo.Length.
Первоначально он написал:
Вы уверены, что backgroundWorker1_DoWork не заканчивается исключением? Например, если эта строка длинна file_size = new FileInfo(@"C:\BioERemote\BioR.mdb").Length; броски.
Я бы начал с того, чтобы убедиться, что на компьютерах установлены последние версии.NET.