2017-02-01 14 views
1

ファイルをダウンロードして、Windowsベースのマシンで古いものを置き換えるプログラムがあります。C#バックグラウンドワーカーの問題

ボタンを押してファイルをダウンロードするたびに、2人のバックグラウンドワーカーが実行されました。バックグラウンドワーカーの1人が実際に新しいファイルのSFTPダウンロードを行う責任があります。他のバックグラウンドワーカーは、毎秒ダウンロードされたファイルサイズを読み取り、ダウンロードの進行状況を判断します。

問題は、文字通りマシンの半分でダウンロードの進行状況が表示されないということです。しかし、ダウンロードはまだ続行されます。 2台のコンピュータで同じプログラムを実行する理由を理解できません。ダウンロードの進行状況は1台のコンピュータに表示されますが、他のコンピュータでは表示されません。

// 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'は例外で終了しませんか?たとえば、この行が ''長いfile_size =新しいFileInfo(@ "C:\ BioERemote \ BioR.mdb")の場合、長さ; 'がスローされます。 –

+0

すべてのコンピュータで* local_remote_destination *は@ "C:\ BioERemote \ BioR.mdb"ですか? – Graffito

+0

ありがとうIvan!問題は私が持っていた本社ビルと全員が同じ品質の接続を持っていると仮定していたことでした。だから私はその1行のコードの周りに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")。スロー。