C#のWindowsフォームアプリケーションをつくっています。
.Netではマルチスレッド関連の選択肢がたくさんあるようですが、以下のようなユースケースではどんな組み合わせにするのがいいのでしょうか?
UIとは別スレッドでネット接続してデータとってきたものをフォームに反映します。UIはブロックして欲しくなくて、ローディング中にはローディング中にアニメーションを表示したりします。
新スレッドを作って、その完了を待つことはできるんですが、その結果をどうフォームに反映するか、というところがよくわかりません。
C#は初心者なのでコード例やリンクをよろしくお願いいたします!
No.1ベストアンサー
- 回答日時:
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で何度もデータを受け取ればいいのでしょうか。
それぞれのスレッドがキューを持って、メッセージをやり取りするような仕組みとかかなぁってイメージしているんですが。
そういう実装は一般的ではないですか?
No.3
- 回答日時:
デリゲートの実装などはBackgroundWorkerを継承したクラスでイベントとして実装した方が良いかと思います
イベントとコールバック
http://msdn.microsoft.com/ja-jp/library/ms229041 …
イベントのデザイン
http://msdn.microsoft.com/ja-jp/library/ms229011 …
キューに関しては明るくないので …
No.2
- 回答日時:
BackGroundWorkerでかまわないと思います
継続処理ですと RunWorkComplateイベントの発生は無いと思います
簡易的な実装でよければ
ProgressChangedイベントを上手につかってやるか
もしくはUDPで受信したデータを引数に取る別のデリゲートを設けて
UDPの受信処理の区切りでデリゲートを呼ぶといった手法になると思います
上記の方法はあまりに大量のデータですとスタックを食いつぶしてしまうなどの弊害が起きる可能性があります
メッセージキューなどによる実装でもいいと思いますよ
この回答への補足
何度もありがとうございます!
>もしくはUDPで受信したデータを引数に取る別のデリゲートを設けて
>UDPの受信処理の区切りでデリゲートを呼ぶといった手法になると思います
こちらは、Invokeを使ってフォームに状態を伝える感じでしょうか?
メッセージキューを使った実装例の参考ページやコード例等ございますか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス フォームの自動入力 1 2023/03/20 00:18
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- HTML・CSS HTMLのフォームについてお尋ねします 1 2022/12/03 21:47
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Access(アクセス) Accessの参照フィールドの列がずれてしまいます 1 2023/07/19 15:00
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- グループウェア slackについて取り急ぎ教えて頂きたいことがあります 2 2022/04/08 09:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数選択のListBoxでClickイベ...
-
ポストバック(__doPostback)へ...
-
C#でドラッグ&ドロップが機能し...
-
ポストバック時の画面スクロー...
-
アクセス+vb 複数コントロー...
-
c# 文字列の最後から1文字削除...
-
オートマトンNFAからDFAへの変換
-
Excel:「フォーム」のボタンで...
-
Q&Aフォームを作成したいのです...
-
ブラウザの×ボタン判定
-
コネクション・セッション・ト...
-
画面遷移が不正ですと表示されます
-
SUBMITボタンを表示させないでS...
-
システム開発の工数と費用について
-
SPREADでカーソルの位置を1行目...
-
DataGridViewのチェックボック...
-
dos画面が一瞬立ち上がる
-
PHPからWindowsログインユーザ...
-
今更、VBAでRPA、キーボード操...
-
チャレンジタッチの画面にスマ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数選択のListBoxでClickイベ...
-
ポストバック時の画面スクロー...
-
【ASP.NET】マスターページに配...
-
C#でドラッグ&ドロップが機能し...
-
【VB6】 変数1 = 変数1 Or $H2
-
Ctrl+vのイベントを解除
-
【ASP2.0】TextBoxのフォーカス...
-
リストビュー内でのドラッグ&...
-
自作exeを常駐させるとPCがシャ...
-
[ASP.NET] ページ内でジャンプ。
-
ポストバック(__doPostback)へ...
-
aspxファイル実行時の表示順に...
-
ドラッグドロップ(AllowDrop)に...
-
C#のマルチスレッド処理について
-
slick.jsによるスライダー実装...
-
TreeViewの制御について
-
treeview展開イベント(VS2010C++)
-
コネクション・セッション・ト...
-
Accessの画面更新を一時的に停...
-
画面遷移が不正ですと表示されます
おすすめ情報