- ベストアンサー
C#のマルチスレッド処理について
C#のWindowsフォームアプリケーションをつくっています。 .Netではマルチスレッド関連の選択肢がたくさんあるようですが、以下のようなユースケースではどんな組み合わせにするのがいいのでしょうか? UIとは別スレッドでネット接続してデータとってきたものをフォームに反映します。UIはブロックして欲しくなくて、ローディング中にはローディング中にアニメーションを表示したりします。 新スレッドを作って、その完了を待つことはできるんですが、その結果をどうフォームに反映するか、というところがよくわかりません。 C#は初心者なのでコード例やリンクをよろしくお願いいたします!
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
C#付属の MSDNでBackgroundWorkerの概要などが参考になると思いますよ BackgroundWorkerオブジェクトを作成して DoWorkイベント、ProgressChangedイベント、RunWorkComplatedイベントのハンドラを記述 実際に データを取得する関数を記述 実行開始ボタン、キャンセルボタンのClickイベントを記述 といった具合でよさそうです ProgressChangedイベントでアニメーション処理を行い RunWorkComplatedイベントで取得データをフォーム側での処理をしてやればいいようですよ
その他の回答 (2)
- redfox63
- ベストアンサー率71% (1325/1856)
デリゲートの実装などはBackgroundWorkerを継承したクラスでイベントとして実装した方が良いかと思います イベントとコールバック http://msdn.microsoft.com/ja-jp/library/ms229041.aspx イベントのデザイン http://msdn.microsoft.com/ja-jp/library/ms229011.aspx キューに関しては明るくないので …
お礼
最後までつきあってくださりどうもありがとうございました! いただいたリンク先のコード例を見ながら、なんとかなりそうです。
- redfox63
- ベストアンサー率71% (1325/1856)
BackGroundWorkerでかまわないと思います 継続処理ですと RunWorkComplateイベントの発生は無いと思います 簡易的な実装でよければ ProgressChangedイベントを上手につかってやるか もしくはUDPで受信したデータを引数に取る別のデリゲートを設けて UDPの受信処理の区切りでデリゲートを呼ぶといった手法になると思います 上記の方法はあまりに大量のデータですとスタックを食いつぶしてしまうなどの弊害が起きる可能性があります メッセージキューなどによる実装でもいいと思いますよ
補足
何度もありがとうございます! >もしくはUDPで受信したデータを引数に取る別のデリゲートを設けて >UDPの受信処理の区切りでデリゲートを呼ぶといった手法になると思います こちらは、Invokeを使ってフォームに状態を伝える感じでしょうか? メッセージキューを使った実装例の参考ページやコード例等ございますか?
補足
ありがとうございます! なるほどProgressChangedとRunWorkerCompletedイベントでBackgroundWorkerの結果を受け取れるんですね。 この例だと、ある処理をBackgroundWorkerにやらせて結果が終わったらBackgroundWorkerの処理は終了すると思いますが、 UDPのポートをあけて違うPCからのデータを待ったりというのも含めて、BackgroundWorkerは継続的に動作しているイメージで考えているんですが、 そういった場合にもBackgroundWorkerを使うのがよいのでしょうか? ProgressChangedで何度もデータを受け取ればいいのでしょうか。 それぞれのスレッドがキューを持って、メッセージをやり取りするような仕組みとかかなぁってイメージしているんですが。 そういう実装は一般的ではないですか?