質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

3回答

651閲覧

(C#)非同期でのイベント処理の実装について

gitiiii

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/04/08 05:31

C#を勉強し始めたばかりです。

株価の更新時に自動でリスク値などを計算するC#アプリケーションを作りたいのですが、

①株価更新イベントをキャッチ
②再計算
③GUIに出力

といった事をやりたい場合にC#ではどのような実装方法を用いるべきなのでしょうか。

調べてみると、イベントやasync/awaitなどの用語は見かけるのですが、
いまいちどれをどう使用すればよいのかが分からない状況です。

下記内容をスレッドセーフかつ拡張性があるような形で実現したいです。

1.Mainスレッドとは別のスレッドで1秒間隔で外部サイトの株価を取得
2.あらかじめリスナを登録しておき、更新された株価をMainスレッドに連携
3.再計算、GUIに反映

非常に抽象的な質問で大変申し訳ありませんが、最近のC#バージョンでどのように実現できるのか
教えて頂けたら幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

こんにちは。

GUIならasync/awaitが便利です。
様々な実装方法がありますので、ベストというわけではないですが参考までに。
(async関数がvoidを返すのはダメという考え方もあります。)

C#

1bool mContinue = true; 2async void UpdadingAsync() 3{ 4 using (HttpClient client = new HttpClient()) 5 { 6 while(mContinue) 7 { 8 var result=await Task.Run(() => 9 { 10 // Thread.Sleep()で取得タイミングになるまで待ち 11 // clientを使って株価情報取得 12 // 再計算 13 return 結果; 14 } 15 // resultを使ってGUI更新 16 } 17 } 18}

更新処理を終了したい時、mContinueをfalseにすれば、その時のwhileループが終わればサブスレッドが終了します。
なお、コンパイルしてませんので、たぶん何かバグっていると思います。その辺は調べて補完下さい。
また、エラー処理は適宜入れて下さい。

投稿2018/04/08 08:08

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

g_uo

2018/04/09 12:59

これ便利ですね。 引数でUI更新用のメソッド渡してやれば、Workerクラスに分離できそうです
guest

0

「最近の」という枕詞がつくなら Reactive Extensions でしょうか。
そこまで新しいわけではありませんが。
ざっくり言うと、イベント、非同期、LINQ を統合したような便利なものです。

漫画で説明しています。
5000兆年ぶりにReactive Extensions再入門

投稿2018/04/08 05:49

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

1.Mainスレッドとは別のスレッドで1秒間隔で外部サイトの株価を取得

その「外部サイト」がどういう API を提供しているかによりますが、普通にクライアントアプリからは HTTP 要求を出して応答を受け取るということでいいのですか?

であれば、クライアントアプリでは HttpClient を使ってタイマーで定期的に要求をかけ、応答に含まれているであろう情報を受け取って表示するということでいかがですか?

具体例は、コンソールアプリの例ですが、以下の記事(それからリンクが貼ってある Microsoft のチュートリアルも)を見てください。

HttpClient で WCF サービスを呼出
http://surferonwww.info/BlogEngine/post/2018/02/24/request-wcf-service-using-httpclient.aspx

上の記事にも書いてありますが、HttpClient の初期化と Dispose を繰り返すようなことをすると、socket が浪費されるという問題があるそうですので、そこは注意してください。

投稿2018/04/08 07:04

編集2018/04/08 07:12
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問