私は非同期の概念を捉え、それを散発的に使用してきましたが、ベストプラクティスに関していくつか質問があります。
例えばwhileなどの条件が変わるまで、存在する可能性のあるデータを取得し続けるために、while(条件)ループ内でawaitを使用してもかまいません。 stopProcessingMessages = false
winformsなどのアプリケーションでは、UIがスレッド上で実行されている間、ボタンクリックなどの操作でasync / awaitを使用するのはかなり簡単ですが、コンソールアプリケーション全体、またはウィンドウ全体で非同期を強制する場合はどうなりますか。サービス。最初に待機しているタスクを最初に開始するためのベストプラクティスは何でしょうか。それはTask.Run(()=> ...)でしょうか。
私は私の第二の質問で意味があることを願っています。私は非同期を最大限に活用し、それを最大限に活用したいのですが、他のすべての非同期関数にバブルダウンする前に、最初の非同期操作を開始する方法を理解する必要があります。
スマートフォンを使って電車の中で正しいコードブロックを使用していないことをお詫び申し上げます。
私は非同期の概念を捉え、それを散発的に使用してきましたが、ベストプラクティスに関していくつか質問があります。
を持っていますイントロasync
/await
ブログ記事これは、ほとんどのイントロよりも詳細に説明されており、いくつかのベストプラクティスも紹介しています。
例えばwhileなどの条件が変わるまで、存在する可能性のあるデータを取得し続けるために、while(条件)ループ内でawaitを使用してもかまいません。 stopProcessingMessages = false
あなたはタイトなループを避けたいです。だからwhile (condition) GetDataIfPresent();
CPUを大量に消費します。
あるいは、async
返されたメソッドnull
(または何でも)stopProcessingMessages
ですtrue
。この場合、あなたのコードはwhile (true)
そして、もっとTAPのような解決策を使うことです。CancellationSource
フラグの代わりに。
また見てくださいTPLデータフロー;それはあなたの種類の状況に役立つかもしれないように聞こえます。
コンソールアプリケーション、さらにはWindowsサービス。最初の待機タスクを最初に開始するためのベストプラクティスは何ですか
コンソールアプリの場合は、Wait
最上位タスクこれは通常のガイドライン(これはawait
の代わりにWait
)Wait
ingはコンソールアプリの間はスレッドを焼き付けますが、通常はもっと複雑なソリューションを保証するのに十分なほど重要ではありません。コンソールアプリケーションにシングルスレッドのコンテキストをインストールしたい場合は、次のようにします。AsyncContext.Run
私からAsyncExライブラリ。
Win32サービスの場合は、通常あなた自身のスレッドを開始する必要がありますか。あなたが使用することができますTask.Run
これのために(あなたがマルチスレッドコンテキストを望むなら)、またはAsyncContextThread
AsyncExから(シングルスレッドコンテキストが必要な場合)
おはようございます、
最初のシナリオでは、非同期/待機パターンよりもTaskCreationOptionを 'LongRunning'に設定した通常のタスクを使用します。 これにより、whileブロック全体が1つの長時間実行タスクで実行されます。各whileループ内でawaitを使用すると、すべてのループで新しいタスクを開始します - うまくいくでしょうが、おそらくそれほど最適ではありません;-)
あなたの2番目の質問に関しては、すみませんがあなたの主張を得られません。
お役に立てれば。
await
sは実際に開始されます...いくつの新しいタスクがありますか?それ以外はstopProcessingMessages
変数が急いで設定された場合、数千のスレッドをスピンアップする可能性があります。とは言っても、「フェッチし続ける」とは何ですか。質問の文脈でも意味ですか?単一のタスクは1結果として、継続的にフェッチされるデータのストリームではありません。 - Snixtor
存在する可能性のあるデータを保持するためにループを使用するのはよくありません。 完了時に自動的にコールバックメソッドを呼び出す非同期呼び出しを作成できます。その場合の「待機」フェーズは、使用されているOSに最適な方法でこの待機フェーズを処理するOSメカニズムで発生します。
主題のそれ以上の研究のためにここを見てください。http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx
async
アクション:Task.Run
電話をかけるだけでは何も得られませんasync
方法。あなたはまだする必要がありますWait
終了する前に、返されるタスクが完了するのを待つために。 - Stephen Cleary