5

私は async await の概念を把握し、散発的に使用してきましたが、ベスト プラクティスに関していくつか質問があります。

  1. while(condition) ループで await を使用して、存在する可能性のあるデータを取得し続けることはできますか?

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

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

適切なコード ブロックを使用していないことをお詫びします。スマートフォンを使用して電車に乗っています。

4

3 に答える 3

7

私は async await の概念を把握し、散発的に使用してきましたが、ベスト プラクティスに関していくつか質問があります。

ほとんどのイントロよりも詳細に説明し、いくつかのベスト プラクティスを紹介するイントロasync/awaitブログ投稿があります。

while(condition) ループで await を使用して、存在する可能性のあるデータを取得し続けることは問題ありませんか? while 条件が変化するまで (たとえば stopProcessingMessages = false)

タイトなループは避けたい。そのためwhile (condition) GetDataIfPresent();、多くの CPU を消費します。

または、 isの場合asyncに返されるメソッドnull(または何でも)を使用できます。この場合、コードは になり、より TAP に似たソリューションは、フラグの代わりに使用することになります。stopProcessingMessagestruewhile (true)CancellationSource

TPL Dataflowも見てください。あなたのような状況に役立つかもしれません。

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

コンソール アプリの場合はWait、最上位のタスクを実行できます。これは、通常のガイドライン (awaitではなくWait) に対する許容可能な例外です。Waiting は、コンソール アプリの実行中にスレッドを焼き付けますが、それは通常、より複雑なソリューションを保証するほど重要ではありません。コンソール アプリにシングル スレッド コンテキストをインストールする場合はAsyncContext.Run、私のAsyncEx ライブラリから使用できます。

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

于 2013-02-18T12:54:11.470 に答える
2

おはようございます、

最初のシナリオでは、async / awaitパターンよりも、TaskCreationOptionを「LongRunning」に設定した通常のタスクを使用したいと思います。このようにして、whileブロック全体が1つの長時間実行タスクで実行されます。各whileループ内でawaitを使用すると、すべてのループで新しいタスクを開始します-動作しますが、それほど最適ではない可能性があります;-)

2番目の質問については、申し訳ありませんが、私はあなたのポイントを取得していません。

お役に立てれば。

于 2013-02-18T06:15:15.327 に答える
0

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

主題のさらなる研究のためにここを見てください:http: //msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

于 2013-02-18T06:20:08.963 に答える