2つの株の板情報を取得するアプリケーションを作っています。
毎秒取得するので、2つのURLに同時アクセスして取得したいのですが、同時取得はできましたがGUIのフリーズが頻発してしまいます。
C#
1// 2つのタスクを作ってほぼ同時にアクセスします。 2// GetPriceLevel1()とGetPriceLevel2()はURLにアクセスして板情報を取得する関数です。 3Task<int> task1 = Task.Run(() => GetPriceLevel1()); 4Task<int> task2 = Task.Run(() => GetPriceLevel2()); 5 6// 2つの板情報が取得されるまで待ちます。 7Task.WaitAll(task1, task2); 8 9// 板情報が取得されたら出力します。 10Console.WrightLine("板1:" + task1.Result.ToString()); 11Console.WrightLine("板2:" + task2.Result.ToString());
ここまではうまくいきました。ほぼ同時に2つの板にアクセスして情報を取得できています。
このコードを関数化し、GUIのFormにSystem.Threading.Timerなどを使って毎秒取得するとGUIがフリーズしてしまいます。
必ずフリーズするのではなく、頻発する感じです。
いろいろ調べていると
同期メソッドから非同期メソッドを呼び出すとアプリケーションがフリーズする - 非同期メソッド呼び出しによるデッドロック
という記事を見つけました。
Task.RunにConfigureAwait(false)メソッドを指定するとGUIスレッドとは別のスレッドで処理してくれるそうです。
しかし、私のコードでは2つのタスクがあるので、
c#
1int task1 = await Task.Run(() => GetPriceLevel1()).ConfigureAwait(false); 2int task2 = await Task.Run(() => GetPriceLevel2()).ConfigureAwait(false); 3 4// Task.WaitAll(task1, task2); ←上記で2つawaitを指定しているのでこれは指定できない。
のようにしてしまうと同時にGetPriceLevel1()とGetPriceLevel2()を実行できません。
2つの関数を同時に実行でき、かつGUIのスレッドとは別のスレッドでTaskを実行するにはどのようにすればよいのでしょうか?
どうぞよろしくお願い致します。
環境:
Windows10 + Visual Studio 2015
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/11/21 10:56
2017/11/21 12:40
退会済みユーザー
2017/11/23 07:22