プロが教える店舗&オフィスのセキュリティ対策術

C#のWindowsフォームアプリケーションをつくっています。
.Netではマルチスレッド関連の選択肢がたくさんあるようですが、以下のようなユースケースではどんな組み合わせにするのがいいのでしょうか?
UIとは別スレッドでネット接続してデータとってきたものをフォームに反映します。UIはブロックして欲しくなくて、ローディング中にはローディング中にアニメーションを表示したりします。

新スレッドを作って、その完了を待つことはできるんですが、その結果をどうフォームに反映するか、というところがよくわかりません。
C#は初心者なのでコード例やリンクをよろしくお願いいたします!

A 回答 (3件)

C#付属の MSDNでBackgroundWorkerの概要などが参考になると思いますよ



BackgroundWorkerオブジェクトを作成して
DoWorkイベント、ProgressChangedイベント、RunWorkComplatedイベントのハンドラを記述
実際に データを取得する関数を記述
実行開始ボタン、キャンセルボタンのClickイベントを記述
といった具合でよさそうです

ProgressChangedイベントでアニメーション処理を行い
RunWorkComplatedイベントで取得データをフォーム側での処理をしてやればいいようですよ

参考URL:http://msdn.microsoft.com/ja-jp/library/system.c …

この回答への補足

ありがとうございます!
なるほどProgressChangedとRunWorkerCompletedイベントでBackgroundWorkerの結果を受け取れるんですね。

この例だと、ある処理をBackgroundWorkerにやらせて結果が終わったらBackgroundWorkerの処理は終了すると思いますが、
UDPのポートをあけて違うPCからのデータを待ったりというのも含めて、BackgroundWorkerは継続的に動作しているイメージで考えているんですが、
そういった場合にもBackgroundWorkerを使うのがよいのでしょうか?
ProgressChangedで何度もデータを受け取ればいいのでしょうか。

それぞれのスレッドがキューを持って、メッセージをやり取りするような仕組みとかかなぁってイメージしているんですが。
そういう実装は一般的ではないですか?

補足日時:2008/09/24 16:04
    • good
    • 0

デリゲートの実装などはBackgroundWorkerを継承したクラスでイベントとして実装した方が良いかと思います



イベントとコールバック
http://msdn.microsoft.com/ja-jp/library/ms229041 …

イベントのデザイン
http://msdn.microsoft.com/ja-jp/library/ms229011 …

キューに関しては明るくないので …
    • good
    • 0
この回答へのお礼

最後までつきあってくださりどうもありがとうございました!
いただいたリンク先のコード例を見ながら、なんとかなりそうです。

お礼日時:2008/10/18 20:58

BackGroundWorkerでかまわないと思います


継続処理ですと RunWorkComplateイベントの発生は無いと思います

簡易的な実装でよければ
ProgressChangedイベントを上手につかってやるか
もしくはUDPで受信したデータを引数に取る別のデリゲートを設けて
UDPの受信処理の区切りでデリゲートを呼ぶといった手法になると思います
上記の方法はあまりに大量のデータですとスタックを食いつぶしてしまうなどの弊害が起きる可能性があります

メッセージキューなどによる実装でもいいと思いますよ

この回答への補足

何度もありがとうございます!

>もしくはUDPで受信したデータを引数に取る別のデリゲートを設けて
>UDPの受信処理の区切りでデリゲートを呼ぶといった手法になると思います
こちらは、Invokeを使ってフォームに状態を伝える感じでしょうか?

メッセージキューを使った実装例の参考ページやコード例等ございますか?

補足日時:2008/09/26 00:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!