| ■68409 / inTopicNo.1) | 
               C# 並列処理について | 
             
          
         
        
        □投稿者/ のぶ (34回)-(2013/10/19(Sat) 16:15:31)  
        
          
            
              
                 | 
                 分類:[C#] 
 
 C#で並列処理を行おうと思い見よう見まねで以下の様なコードを書いてみました。
目的の動作はできていそうなのですが、この書き方がベストな書き方かが分からないので
添削というか、おかしそうな所等を指摘して頂けるとありがたいと思います。
参考にしたサイト : http://www.kanazawa-net.ne.jp/~pmansato/parallel/parallel_ui.htm
目的             : 対象ファイルに対し処理を行い、その進捗状況をプログレスバーに表示したい(ソースは確認の為TextBoxも使ってます)
button1          : 以下の処理を行う「Run」ボタン
button2          : キャンセルする為の「Cancel」ボタン
button2実装      : button2.Click += (obj, e) => { cts.Cancel(); };
void button1_Click(object sender, EventArgs e)
{
  button1.Enabled = false; //ボタンの無効化
  progressBar1.Value = 0;
  progressBar1.Minimum = 0;
  cts = new CancellationTokenSource(); //Taskキャンセル用
  ParallelOptions po = new ParallelOptions(); //Parallelキャンセル用
  po.CancellationToken = cts.Token; //Tokenの統一
  //対象フォルダの取得
  var dirs = Directory.GetDirectories(@"D:\Test", "*", SearchOption.AllDirectories);
  //対象ファイル(txt)のあるフォルダの取得
  var target = from x in dirs
                where Directory.GetFiles(x, "*.txt").Length > 0
                select x;
  //プログレスバーの設定
  progressBar1.Maximum = target.Count();
  //UIスレッドのタスクスケジューラーを取得
  var tskSch = TaskScheduler.FromCurrentSynchronizationContext();
      
  //taskの実行
  var task = Task.Factory.StartNew(() =>
    {
      try
      {
        //並列処理の実行
        Parallel.ForEach(target, po, path =>
          {
            Thread.Sleep(5000); //ここで実際には対象ファイルに対して処理を行う
            //UI操作用のTaskの実行
            Task.Factory.StartNew(() =>
              {
                progressBar1.Value++;
                textBox1.Text += path + Environment.NewLine;
              }, cts.Token, TaskCreationOptions.AttachedToParent, tskSch);
          });
      }
      catch (OperationCanceledException ex)
      {
        //キャンセルされた場合に例外が発生する
        MessageBox.Show("きゃんせる!");
      }
    },cts.Token);
  //続いて行いたい処理
  task.ContinueWith(arg =>
    {
      button1.Enabled = true;
    }, tskSch);
}
  | 
               
            
           
         
        
       |