[過去ログ]
ふらっと C#,C♯,C#(初心者用) Part138 (1002レス)
ふらっと C#,C♯,C#(初心者用) Part138 http://mevius.5ch.net/test/read.cgi/tech/1528194762/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
779: デフォルトの名無しさん (ワッチョイ 9f5d-haGl) [sage] 2018/07/21(土) 20:35:04.73 ID:BEEMYUE30 私は >>773 ですが Invoke について自分があまり良く分かってない気がしてきたので 詳しい方がいらっしゃったら教えてください UIスレッドで Parallel.ForEach を呼ぶとUIスレッドをつかんだまま並列処理が実行されて、 その並列処理のスレッドで Invoke を使うとデッドロックしてしまう気がするのですが 実際はそういうことはないのでしょうか? http://mevius.5ch.net/test/read.cgi/tech/1528194762/779
781: デフォルトの名無しさん (ワッチョイ 9f5d-haGl) [sage] 2018/07/21(土) 21:15:58.91 ID:BEEMYUE30 >>779 です WPF で下のようなコードを実行してみたらやっぱりデッドロックしてしまいました Invoke はそれなりに慎重に使わないといけないみたいです void Button_Click(object sender, RoutedEventArgs e) { MessageBox.Show("このメッセージは必ず表示される"); Parallel.ForEach(Enumerable.Repeat(0, 2), i => Dispatcher.Invoke(() => { })); MessageBox.Show("デッドロックするとこのメッセージは表示されない"); } ちなみに Enumerable.Repeat(0, 2) の部分を変えると以下のような挙動でした Enumerable.Repeat(0, 0) に変える → デッドロックしない Enumerable.Repeat(0, 1) に変える → デッドロックする new int[] { } に変える → デッドロックしない new int[] { 0 } に変える → デッドロックしない new int[] { 0, 0 } に変える → デッドロックする http://mevius.5ch.net/test/read.cgi/tech/1528194762/781
783: デフォルトの名無しさん (ワッチョイ bf99-DFDX) [sage] 2018/07/21(土) 21:18:17.40 ID:nH897ECr0 >>779 並列処理はUIスレッドではないスレッドで行われるよ。 いや、UIスレッドで行われるとは限らない、と言う言い方の方が正しいかな。 UIスレッドを掴んだままの意味がわからんが、挙動が謎なら、ブレークポイントつけて実行して、どのスレッドが何をしてるかを把握してはいかがだろうか。 今どのスレッドを使ってるかは表示されてるから。 http://mevius.5ch.net/test/read.cgi/tech/1528194762/783
789: デフォルトの名無しさん (ワッチョイ 9f5d-haGl) [sage] 2018/07/21(土) 22:44:23.68 ID:BEEMYUE30 >>788 あくまで私一人の考えですが・・・ [1] Invoke を使うと >>779 に書いたような理由でデッドロックするので Parallel.ForEach でUIスレッドを使いたいなら >>773 のようにすべき [2] しかし、同じく >>779 に書いたように Parallel.ForEach はUIスレッドを つかんだまま並列処理を行うのでデータグリッドの更新処理だけ Parallel.ForEach から切り出してもほとんど同じなのでは? (一応 localFinally 中も他のスレッドは動けるので そこで更新処理を行う方がいい場合もあるかもしれない) [3] 並列処理が必要なほど大きな処理を行うなら、 一度UIスレッドを手放す選択肢も考えてみては? ただ、Invoke がダメだと考えている人間自体が私だけのような気もするので 他の方の意見も聞いてみたほうがいいと思います あと、[3] に関しては場合によりけりだと思うので、 具体的な処理内容を教えていただければ私の考えをお伝えしたいと思います http://mevius.5ch.net/test/read.cgi/tech/1528194762/789
791: デフォルトの名無しさん (ワッチョイ 9f7f-0FgR) [sage] 2018/07/21(土) 23:00:46.86 ID:gktKld7A0 既に>>779に書いてあったね。その通り。 http://mevius.5ch.net/test/read.cgi/tech/1528194762/791
792: デフォルトの名無しさん (ワッチョイ 9f5d-haGl) [sage] 2018/07/21(土) 23:10:20.56 ID:BEEMYUE30 >>790-791 レスありがとうございます >>779 の考えで正しいのか不安だったのですがお陰様で自身が持てました 他に何かおかしなことを言ってしまっていたら教えていただけると嬉しいです >>788 >>789 はレスとしてとっ散らかっている気がしてきたので一問一答で答えてみます > つまりフォームアプリでParallel処理内でinvokeってそもそも悪手なんでしょうか Parallel を UI スレッドで実行する場合は悪手というか、致命的だと思います > それともThread生成してその中でParallelすれば良かったり…?これはすごい破綻してる気がしますが それなら期待通りの動作にはなると思います。ただ、確かにあまりいい方法ではないと思います > uiスレッドから切り離した他スレッドから安全にuiを制御するなんて考えが可笑しいんでしょうか 正しく Invoke を使えば問題ないと思います しかし今回の件からもわかるように、Invoke を正しく使うのはなかなか難しいようです http://mevius.5ch.net/test/read.cgi/tech/1528194762/792
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.041s