質問: await Task.Run(() => GetPriceLevel2()).ConfigureAwait(false); // Task.WaitAll(task1, task2); ←上記で2つawaitを指定しているのでこれは指定できない。 ``` のようにしてしまうと同時にGetPriceLevel1()とGetPriceLevel2()を実行できません。 2つの関数を同時に実行でき、かつGUIのスレッドとは別のスレッドでTaskを実行するにはどのようにすればよいのでしょうか? どうぞよろしくお願い致します。 環境: Windows10 + Visual Studio 2015
回答: こんにちは。 > > このコードを関数化し > > > の内容が分かりませんが、async関数ではなく普通の関数にしたと仮定して回答します。 GetPriceLevel1()やGetPriceLevel2()の処理が次の1秒処理開始までに終了していないのではないでしょうか? その結果、同じクライアントからの同じ要求のシーケンスが複数入り混じって発生して要求と応答の対応が取れず、おかしくなっている可能性が疑わしく感じます。 前の処理が終わってから次の処理を開始するには、System.Windows.Forms.Timerを使うと簡単です。 こちらはメイン・スレッドで次処理を開始しますから、関数化した関数から抜けるまで次の処理は始まりません。 ちなみに、ConfigureAwait(false)は後続の処理をTask.Run()が起動したスレッドで行う指定だそうですからTask.Run()に指定した処理GetPriceLevel1()が終わってから次に進むことになります。 【蛇足ですが】 多くのサイトでConfigureAwait(false)を使うことが推奨されているようですが、メイン・スレッドと同期する機能がありがたいasync関数のその機能を完全にキャンセルするのなら、最初からasync関数にしない方が良いような気がします。単にTaskで十分です。そのほうが簡単ですし。