2017-05-04 18 views
2

申し訳ありませんが、私はこれを短く正確に保ちたいと思います。大量のHttpWebRequestsを完成させる最も効率的な方法を見つけようとしていますが、私はTask.WaitAll関数を使用して、すべてのタスクが完了するまで待機します。タスク(アクション)を非同期タスクにするには余計ですか?たぶん私は、コード内で、より良い自分自身を説明することができますので、非常にシンプルタスクを使用した非同期プログラミング

 for (int i = 0; i < 50; i++) 
     { 
      taskList.Add(Task.Run(() => DoSomething())); 
     } 
     Task.WaitAll(taskList.ToArray()); 

[OK]を、私はThreadPoolの内で利用可能なスレッドでdoSomethingのメソッドを実行しますループのために、今のは、どのように私ができる2人の異なるルックスを取らせています私はすでに、すでにそれはです意味Task.Run機能のdoesntを切っdoSomethingの機能を送っていた場合

public void DoSomething() 
{ 
Send off the HttpWebRequest here, with no awaits or any async programming 
} 

OR

public Task<ResponseData> DoSomething() 
{ 
Write the request here that awaits for responses, streams etc 
} 

このdoSomethingの()関数を実装ThreadPoolで独自のスレッドを実行していますか? DoSomething関数を実際のタスクにして、そのスコープ内でawaits/async機能を実装することは冗長になりますか?もっとリソースを無駄にしてしまうのではないでしょうか?

+0

これ以上の文脈で答えることはできません。 'DoSomething()'はあなたのHTTPリクエストよりも何かをしますか?要求が行われた後に何かをする必要がありますか?リクエストを行うだけであれば、非同期リクエストAPIを使用し、リクエストを表す 'Task'を' DoSomething() 'から返し、' Task.Run()を使うのではなく、リストに_that_を追加するだけです。 '。 'DoSomething()'がリクエストの後に処理する処理が増えている場合は、それを行う必要がありますが、 'wait 'することができます。いずれにしても、 'Task.Run()'は必要ないでしょう。しかし、あなたはコードを共有していないので、誰が話すことができます。 –

+0

タスクを返す関数は、タスクを返す関数をTask.Runに渡しているかのように、スレッドプール上のスレッドに既にアクセスしていますか? だからTask.Run(()=> DoSomething());タスクを返す関数を作成するのと同じでしょうか? –

+0

_ "タスクを返す関数は既にスレッドプール上のスレッドにアクセスしていますか?" - 必ずしもそうである必要はありません。しかし、非同期で動作しています。これは上記のコードで気にしていることです。 "非同期"と "同時"または "スレッド"を混同しないでください。 2つは密接に関連していますが、同じではありません。アクティブなスレッドに依存しない非同期メカニズムがあります。 –

答えて

2

私はすでに、すでにそれが ThreadPoolの中にそれ自身のスレッドで実行されているわけTask.Run 機能のdoesntを切っdoSomethingの機能を送りますか? DoSomething関数を実際の タスクにし、そのスコープ内でawaits/async機能を実装すると、 は冗長になります

逆の回答 - 「何もしない」という方法で別のスレッド(Task.Run)を使用しているときは、リソースを無駄にしています。

await DoSomethingAsynchronously()は、正しく作成されたasync-awaitメソッドが1つのスレッドで実行されるため、異なるものです。
あなたのケースでは、要求を出して実行者を呼び出し元に戻します。応答が到着した後、待ってから実行を続けます。

何もしない方法でTask.Runを使用すると、応答を待つだけでリソース(スレッド)が無駄になります。

DoSomethingメソッドは外部リソース(webervices)と連携するため、ThreadPoolとスレッドについてはまったく心配する必要はありません。すべてのタスクは、async-awaitのアプローチで1つのスレッドで非同期に実行できます。

+0

私がしたのは、コメントに必要な簡潔さのために必然的に単純すぎます。あなたは第3パラグラフで何を言おうとしているのかを完全に理解していますが、明らかに明らかにしようとしません。 2つのオプションは、タスクを1つずつ待つか、すべての人を待ちます。 1で1を待つのは、実際にリソースの使用を減らしたい場合や、以前のタスクの結果と関係がある場合のみです。 「すべてを完了してから、このポイントまで移動してください」という意味です。あなたが使っているものにかかわらず、メソッドの終わりに非同期タスクを待たなければなりません(他のメソッドのためにそれを前進させない限り)。そうでなければ、あなたは悪いレース状態になります。 –

+0

@OriRefael、私は複数のタスクについて話していませんでした。第3段落では、私は「生のまま」、非同期メソッドを1つのスレッドで実行できると説明しました。 – Fabio

+0

複数のタスクがある場合にasync-awaitを使用する方法を明確にしたいと考えました。 –