■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);
}
|
|