2017-02-01 19 views
1

У меня есть программа, которая загружает файл, а затем заменяет старый на компьютере под управлением Windows.C# Background Worker Issue

У меня есть два фоновых работника, которые запускаются при каждом нажатии кнопки для загрузки файла. Один фоновый работник отвечает за фактическое выполнение загрузки 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

Вы уверены, что 'backgroundWorker1_DoWork' не заканчивается исключением? Например, если эта строка 'long file_size = new FileInfo (@" C: \ BioERemote \ BioR.mdb "). Length;' throws. –

+0

Вы уверены, что на всех компьютерах * local_remote_destination * есть @ "C: \ BioERemote \ BioR.mdb"? – Graffito

+0

Спасибо, Иван! Проблема заключалась в том, что я предполагал, что у всех было такое же качество связи с нашим зданием штаб-квартиры, что и у меня. Таким образом, я поставил оператор try catch вокруг этой одной строки кода и устранил проблему. Загадочная вещь: программа никогда не выйдет из строя или не вызовет ошибку. Я предполагаю, что backgroundWorker1 не удалось на медленных соединениях и просто никогда не выкидывал ошибку и просто ушел, и пусть backgroundWorker2 продолжает загружаться. – dcfjoe

ответ

-1

Я бы начал с того, что версии .NET были обновлены на машинах.

+0

Я нацелился на эту сборку в Visual Studio на .NET Framework 4. Я установил последнюю версию .NET Framework 4.6.2 на машины, которые не работали. Это не устранило проблему. – dcfjoe

1

У Ивана Стоева был ответ. Мне нужно было поставить инструкцию try catch в моей инструкции FileInfo.Length.

Первоначально он писал:

Вы уверены, что backgroundWorker1_DoWork не заканчивается исключением? Для экземпляр, если длина этой строки file_size = new FileInfo (@ "C: \ BioERemote \ BioR.mdb"). Длина; броски.