2017-12-08 9 views
0

これは、私たちのasyncメソッドであり、タスクで長時間実行されます。.NETに関してタスクが終了するのを待つ最善の方法は何ですか?

public async Task<int> LongRunningMethod(T p1, T p2, T p3); 

私のチームでは一部の開発者は、いくつか使用していますが

await LongRunningMethod(p1,p2,p3); 
// Here too, we simply 'await' till the method finishes. 

注意を

Task t = Task.Factory.StartNew(LongRunningMethod(p1,p2,p3)); 
t.Wait(); //This will suspend main thread and wait for 't' to finish. 

を使用します。私たちは、非同期タスクを持って、我々は、そのタスクが完了しますまで待ち​​たいです。

要するに、上記の2つの構成のうち、どちらが最適ですか?

+0

「最高」を定義してください。 –

+2

なぜ非同期的に待機しないのですか? * await *)を実行してタスクを完了しますか?また、ネストされたタスクの問題(例えば、ここでは 'Task 'または 'Task ')を実行するため、Task.Factory.StartNewを使用することは正しいでしょう。あなたがそれを使用しない魅力的な理由がある場合(StartNewで既に動作する既存のレガシーコードのような)、Task.Runを優先します。 –

+0

これは 'Task'であり、' Thread'ではありません。そして、いいえ、必ずしも同じものではありません。相違点については[こちら](https://stackoverflow.com/questions/4130194/what-is-the-difference-between-task-and-thread)、[こちら](https://stackoverflow.com/)を参照してください。質問/ 37419572/if-async-await-doesnt-create-any-additional-threads-then-how-make-appl-appl)を使用します。 – john

答えて

2

を、使用することができますか?システムのスケーラビリティが絵になると

あなたは、影響を知っているだろう、Task.Wait()await Taskとの違いは、彼らは、呼び出し/実行中のスレッドを処理する方法です。完了するまで最初のブロックがブロックされると、awaitを使用する別の呼び出し元が呼び出し元を解放しますが、IO呼び出し、ネットワーク呼び出し、メモリの論理処理ではないデータベース呼び出しを意味するTrue Asynchronous呼び出しのみに注意してください非同期APIを公開します。つまり、スレッドを呼び出すか、コンテキストが解放されます。真の非同期呼び出しの場合、非同期パイプラインを実行するために、ウィンドウ内のIO完了ポート(キューイングメカニズム)を使用します。

これは、コールチェーンの最後のメソッドの最後がtrueの非同期でない場合には発生しません。両方の継続は、ポスト完了を実行しますが、のは、例を取るようになるため

彼らは、Waitawait

実際にはほとんど似て、通常のスレッドが直接システム内のコアの数にリンクされて処理さ取得TPLを使用すると、これらのスレッドはプールから呼び出され、使用可能なスレッドの数に制限があります。 100 K /秒の要求のような高スケーラブルなシステムでは、スレッドがアイドリングしてブロックされているために新しい要求を受け取らないため、このようなブロックを待たずに、長時間実行されるメソッドに対してはTask.Wait()まったく起こりません。

具体例

  • のJavascript、NodeJsは常にデフォルトで非同期要求のために行く、システムは

  • 高度にスケーラブルある理由であるブロッキングは、またに沿って、ConfigureAwait(false)を考えません待っていると、実行を継続するために再入力するのと同じスレッドコンテキストが検索されません。これははるかに効率的です

2

タスクを使用するポイントは、同じコンテキストからいくつかのタスクを並行して実行することです。コンテキストから長時間実行するタスクを開始したいだけで、タスクが終了するのを待っていたい場合は、表示された両方のメソッドが同じように動作します。

しかし、あなたは 、実行時間の長いタスクの実行中に他の操作を行いたい場合は、

Task taskObj = LongRunningMethod(); 
/// Do some other operations here... 
var result = await taskObj; 

として行うことができますしかし、あなたがする必要があるいくつかの操作を行うには、実行時間の長いタスクから結果が必要な場合タスクが完了するのを待ちます。 またはあなたは1つが上記の2つの構築物の中で最高であるTask.ContinueWith()要するに

+1

'await'が導入されているので、私は' ContinueWith 'これはPre' await'設定では一般的でしたが、Task.Waitと同じ制限があります –

関連する問題