2016-12-08 12 views
0

いくつかのファイルをとり、乱数に名前を変更して別のフォルダに保存するプログラムを作った。私はコードを自分の望むようにすることができましたが、扱うファイルは時にはかなり大きく、しばらく時間がかかります。これは、ユーザーが時々プログラムがクラッシュしたと思うことを意味します。C#引数を取る関数付きプログレスバー

プログレスバーをプログラムに追加して、まだ動作していてクラッシュしていないことを明示します。

私はanother question on how to add a progress barを見ましたが、私の場合、関数は、ユーザーがクリックするボタンに依存する摂取量をとります。

私のコードにどのように追加できるのかよくわかりません。理想的には、私はbackgroundWorker_DoWorkに追加の入力を取ることができるので、それは(object sender, DoWorkEventArgs e, string[] Files)になりますが、それは可能ではないようです。

ご協力いただければ幸いです。

関連機能のためのコードは以下の通りです:

あなたのコードを考慮
private void blindSelected_Click(object sender, EventArgs e) 
    { 
     List<string> toBlind = new List<string>(); 
     // Find all checked items 
     foreach (object itemChecked in filesToBlind.CheckedItems) 
     { 
      toBlind.Add(itemChecked.ToString()); 
     } 
     string[] arrayToBlind = toBlind.ToArray(); 

     blind(arrayToBlind); 
    } 

    private void blindAll_Click(object sender, EventArgs e) 
    { 
     List<string> toBlind = new List<string>(); 
     // Find all items 
     foreach (object item in filesToBlind.Items) 
     { 
      toBlind.Add(item.ToString()); 
     } 
     string[] arrayToBlind = toBlind.ToArray(); 

     blind(arrayToBlind); 
    } 

    private void blind(string[] files) 
    { 
      // Generate an integer key and permute it 
      int[] key = Enumerable.Range(1, files.Length).ToArray(); 
      Random rnd = new Random(); 
      int[] permutedKey = key.OrderBy(x => rnd.Next()).ToArray(); 

      // Loop through all the files 
      for (int i = 0; i < files.Length; i++) 
      { 
       // Copy original file into blinding folder and rename 
       File.Copy(@"C:\test\" + files[i], @"C:\test\blind\" + permutedKey[i] + Path.GetExtension(@"C:\test\" + files[i])); 
      }    

      // Show completed result 
      MessageBox.Show("Operation complete!", "Done!", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     } 

答えて

1

、私はあなたがそれがどのように動作するかの詳細については、グーグルができ、async/awaitを使用してお勧めします。これらを使用すると、これだけのようなあなたのblind機能を変更することができます。

private async Task blind(string[] files) 
{ 
     // Generate an integer key and permute it 
     int[] key = Enumerable.Range(1, files.Length).ToArray(); 
     Random rnd = new Random(); 
     int[] permutedKey = key.OrderBy(x => rnd.Next()).ToArray(); 

     // Loop through all the files 
     for (int i = 0; i < files.Length; i++) 
     { 
      // Copy original file into blinding folder and rename 
      // Notice, this will wait for the Task to actually complete 
      await Task.Run(() => File.Copy(@"C:\test\" + files[i], @"C:\test\blind\" + permutedKey[i] + Path.GetExtension(@"C:\test\" + files[i]))); 
      someProgressBar.PerformStep(); // Or just set value by yourself 
     }    

     // Show completed result 
     MessageBox.Show("Operation complete!", "Done!", MessageBoxButtons.OK, MessageBoxIcon.Information); 
} 

これはblind関数は非同期で実行されることを保証します。しかし、someProgressBarを追加することを忘れないでください。

この例外を投げることができないに関するいくつかの欠点を持っているので、あなたがblind関数内だけでなく、それらを扱うことを確認します - など

ファイルをコピーすることができないかどうかを確認
関連する問題