DOBON.NETプログラミング道掲示板
(現在 過去ログ2 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33485 / inTopicNo.1)  forループの並列化とUI操作について
  
□投稿者/ ぺんたごん 一般人(19回)-(2016/10/04(Tue) 17:46:03)
  • アイコン環境/言語:[C#、.NET 4.5.x] 
    分類:[.NET] 

    ごぶさたしてます。

    今回、foreachループ内の処理が時間がかかるもののため、
    高速化のためにParallel.ForEachに置き換えようとしています。
    ただ、ループごとにProgressイベントが発生するクラス設計になっており、
    フォーム側はこれをフックしてプログレスバのValueを足しています。

    順序は関係ないので並列化しても問題ない内容なのですが、
    Parallel.Forは全ループ終わるまで待機するので、
    Invokeしちゃうとデッドロックすると思います。

    何か良い方法はございますでしょうか…
引用返信 削除キー/
■33486 / inTopicNo.2)  Re[1]: forループの並列化とUI操作について
□投稿者/ 魔界の仮面弁士 大御所(1049回)-(2016/10/04(Tue) 20:33:51)
  • アイコンNo33485に返信(ぺんたごんさんの記事)
    > forループの並列化とUI操作について
    > 今回、foreachループ内の処理が
    > Parallel.ForEachに置き換えようと
    > Parallel.Forは全ループ終わるま

    for なのか foreach なのか…


    > 高速化のためにParallel.ForEachに置き換えようとしています。
    データ数が少なく、1 回あたりの処理に時間がかかる場合には、
    Parallel.ForEach で高速化するかもしれませんね。

    各回の処理時間が短い場合は、逆に遅くなりがちですが。


    > フォーム側はこれをフックしてプログレスバのValueを足しています。
    Marquee スタイルの ProgressBar では無いのですね。


    > Parallel.Forは全ループ終わるまで待機するので、
    「時間がかかる処理」を行うのが目的なのですよね?

    ならば Parallel.ForEach にしろ foreach にしろ、
    それらを UI スレッドで動作させてはマズイと思います。

    そもそも UI スレッドを待機させる必要は無く、
    時間のかかる処理をワーカースレッドで処理させて、
    Value を増やす際にだけ Invoke すれば
    良いのではないでしょうか。クラス設計次第ですけど。
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -