2017-02-01 40 views
1

我有一個程序下載一個文件,然後在基於Windows的機器上替換舊版本。C#後臺工作人員問題

我有兩個後臺工作人員,只要按下按鈕即可下載文件。一個後臺工作人員負責實際執行新文件的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

Ivan Stoev得到了答案。我需要在我的FileInfo.Length語句周圍放一個try catch語句。

他原本寫道:

你肯定backgroundWorker1_DoWork不會例外結束?對於 實例如果此行長file_size = new FileInfo(@「C:\ BioERemote \ BioR.mdb」)。拋出。