2016-08-06 8 views
2

私は.NETフレームワークのタスク並列ライブラリ(およびマルチタスクとマルチスレッド一般)を初めて使用しています。 私が読んだ文献から、私はちょうど一連の作業を作成できるはずです。 それらを実行し、システム上で利用可能なリソースに応じて必要な数のスレッドを のスレッドで生成する必要があります。 問題は、タイムリーに何千ものHTTPリクエストを作成していることです。 これは私のコードです。タスク並列ライブラリを使用して多数のHTTP要求を作成する方法

var taskList = new List<Task>(); 
foreach(var request in requests) 
{ 
    taskList.Add(client.SendAsync(request)); 
} 
Task.WaitAll(taskList.ToArray()); 

clientSystem.Net.Http.HttpClientオブジェクトです。 Task.WaitAll()を使用しています。このコードは非同期メソッドではないためです。 このコードをテストするには、同じLAN上の別のサーバーに要求を出しています。 要求の収集には15,000以上があるため、オブジェクトごとにタスクを作成する必要があります。 しかし、集計例外をスローする前に約7,000回しか実行できません。内部例外は非常に有用ではないようで、 "タスクがキャンセルされました"と記載されています キャンセルトークンはキャンセルが要求されなかったと報告します。 System.Threading.Tasks.Task.WaitAllで

(タスク[]タスク、のInt32 millisecondsTimeout、CancellationToken cancellationToken)システムで : スタックトレースは非常に有用であることのいずれかに示す最新の呼び出しではなく、 .Threading.Tasks.Task.WaitAll(タスク[]タスクのInt32 millisecondsTimeout)System.Threading.Tasks.Task.WaitAll(タスク[]タスク)で

Iはまた、Parallel.Invoke()で遊んそれはるかに悪化しました。

var taskActionList = new List<Action>(); 
foreach(var request in requests) 
{ 
    taskActionList.Add(() => client.SendAsync(request)); 
} 
Parallel.Invoke(taskActionList.ToArray()); 

これは例外をスローしませんが、それは約1300のタスクを実行し、 コードが完了するまで実行されます。

私の質問は、効率的に に多数のHTTP要求を作成するためにタスク並列ライブラリをどのように使用しますか?私が紛失しているものはありますか?

+0

私はあなたが試した 'async-await'アプローチとは関係ありません。 – Fabio

+0

[HttpClient - タスクがキャンセルされた - 正確なエラーメッセージを取得する方法?](http:// stackoverflow。com/questions/19120675/httpclient-task-was-cancelled-how-to-exact-error-message) – Fabio

+0

あなたが取得している例外はおそらくリクエストの一部がタイムアウトしたためです。あなたは非常に短時間で膨大なリクエストを送信していますが、これが起こることを期待してください。 1つのリクエストがタイムアウトするとどうなるでしょうか?また、ある瞬間のアクティブなリクエスト数を妥当な数値に制限するべきではありません。 10? –

答えて

2

TPLは、HTTPコールを最適にスケジュールする方法を知らない。あなたがIOを実行していることはわかりません。ヒューリスティックは不十分です。

通常、IOの任意の並列度は、実験的に決定する必要があります。この最適なDOPが使用されるようにコードを記述する必要があります。組み込みのコンストラクトのどれもあなたに正確なDOPを提供することはできません。それは常に最大です。

ここで何かが過負荷になってタイムアウトが発生しました。キャンセルの例外はしばしばタイムアウトの兆候です(はい、疑わしいAPIデザインです)。

これにはForEachAsyncを使用できます。

requests.ForEachAsync(async() => await ProcessAsync(request)).Wait(); 
関連する問題