4

私は非同期の概念を捉え、それを散発的に使用してきましたが、ベストプラクティスに関していくつか質問があります。

  1. 例えばwhileなどの条件が変わるまで、存在する可能性のあるデータを取得し続けるために、while(条件)ループ内でawaitを使用してもかまいません。 stopProcessingMessages = false

  2. winformsなどのアプリケーションでは、UIがスレッド上で実行されている間、ボタンクリックなどの操作でasync / awaitを使用するのはかなり簡単ですが、コンソールアプリケーション全体、またはウィンドウ全体で非同期を強制する場合はどうなりますか。サービス。最初に待機しているタスクを最初に開始するためのベストプラクティスは何でしょうか。それはTask.Run(()=> ...)でしょうか。

私は私の第二の質問で意味があることを願っています。私は非同期を最大限に活用し、それを最大限に活用したいのですが、他のすべての非同期関数にバブルダウンする前に、最初の非同期操作を開始する方法を理解する必要があります。

スマートフォンを使って電車の中で正しいコードブロックを使用していないことをお詫び申し上げます。

3 답변


7

私は非同期の概念を捉え、それを散発的に使用してきましたが、ベストプラクティスに関していくつか質問があります。

を持っていますイントロasync/awaitブログ記事これは、ほとんどのイントロよりも詳細に説明されており、いくつかのベストプラクティスも紹介しています。

例えばwhileなどの条件が変わるまで、存在する可能性のあるデータを取得し続けるために、while(条件)ループ内でawaitを使用してもかまいません。 stopProcessingMessages = false

あなたはタイトなループを避けたいです。だからwhile (condition) GetDataIfPresent();CPUを大量に消費します。

あるいは、async返されたメソッドnull(または何でも)stopProcessingMessagesですtrue。この場合、あなたのコードはwhile (true)そして、もっとTAPのような解決策を使うことです。CancellationSourceフラグの代わりに。

また見てくださいTPLデータフロー;それはあなたの種類の状況に役立つかもしれないように聞こえます。

コンソールアプリケーション、さらにはWindowsサービス。最初の待機タスクを最初に開始するためのベストプラクティスは何ですか

コンソールアプリの場合は、Wait最上位タスクこれは通常のガイドライン(これはawaitの代わりにWaitWaitingはコンソールアプリの間はスレッドを焼き付けますが、通常はもっと複雑なソリューションを保証するのに十分なほど重要ではありません。コンソールアプリケーションにシングルスレッドのコンテキストをインストールしたい場合は、次のようにします。AsyncContext.Run私からAsyncExライブラリ

Win32サービスの場合は、通常あなた自身のスレッドを開始する必要がありますか。あなたが使用することができますTask.Runこれのために(あなたがマルチスレッドコンテキストを望むなら)、またはAsyncContextThreadAsyncExから(シングルスレッドコンテキストが必要な場合)


  • 簡潔な答えスティーブンをありがとう。私は実際にはTPL DataflowのBufferBlockを使い始めました。コンソール環境では、Task.Run(async()=> await ....);ということもわかりました。最初の非同期プロセスをキックするのも十分でしょう。 - Sash
  • コンソールトップレベルにasyncアクション:Task.Run電話をかけるだけでは何も得られませんasync方法。あなたはまだする必要がありますWait終了する前に、返されるタスクが完了するのを待つために。 - Stephen Cleary

2

おはようございます、

最初のシナリオでは、非同期/待機パターンよりもTaskCreationOptionを 'LongRunning'に設定した通常のタスクを使用します。 これにより、whileブロック全体が1つの長時間実行タスクで実行されます。各whileループ内でawaitを使用すると、すべてのループで新しいタスクを開始します - うまくいくでしょうが、おそらくそれほど最適ではありません;-)

あなたの2番目の質問に関しては、すみませんがあなたの主張を得られません。

お役に立てれば。


  • 確かに、いっぱいのループawaitsは実際に開始されます...いくつの新しいタスクがありますか?それ以外はstopProcessingMessages変数が急いで設定された場合、数千のスレッドをスピンアップする可能性があります。とは言っても、「フェッチし続ける」とは何ですか。質問の文脈でも意味ですか?単一のタスクは1結果として、継続的にフェッチされるデータのストリームではありません。 - Snixtor

0

存在する可能性のあるデータを保持するためにループを使用するのはよくありません。 完了時に自動的にコールバックメソッドを呼び出す非同期呼び出しを作成できます。その場合の「待機」フェーズは、使用されているOSに最適な方法でこの待機フェーズを処理するOSメカニズムで発生します。

主題のそれ以上の研究のためにここを見てください。http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

リンクされた質問


関連する質問

最近の質問