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

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

ただいまの
回答率

90.51%

  • C#

    8534questions

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

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

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 584

gitiiii

score 4

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

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

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

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

こんにちは。

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

bool mContinue = true;
async void UpdadingAsync()
{
    using (HttpClient client = new HttpClient())
    {
        while(mContinue)
        {
            var result=await Task.Run(() =>
            {
                // Thread.Sleep()で取得タイミングになるまで待ち
                // clientを使って株価情報取得
                // 再計算
                return 結果;
            }
            // resultを使ってGUI更新
        }
    }
}


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/09 21:59

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

    キャンセル

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 が浪費されるという問題があるそうですので、そこは注意してください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C#

    8534questions

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