私は.NETフレームワークのタスク並列ライブラリ(およびマルチタスクとマルチスレッド一般)を初めて使用しています。 私が読んだ文献から、私はちょうど一連の作業を作成できるはずです。 それらを実行し、システム上で利用可能なリソースに応じて必要な数のスレッドを のスレッドで生成する必要があります。 問題は、タイムリーに何千ものHTTPリクエストを作成していることです。 これは私のコードです。タスク並列ライブラリを使用して多数のHTTP要求を作成する方法
var taskList = new List<Task>();
foreach(var request in requests)
{
taskList.Add(client.SendAsync(request));
}
Task.WaitAll(taskList.ToArray());
client
System.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要求を作成するためにタスク並列ライブラリをどのように使用しますか?私が紛失しているものはありますか?
私はあなたが試した 'async-await'アプローチとは関係ありません。 – Fabio
[HttpClient - タスクがキャンセルされた - 正確なエラーメッセージを取得する方法?](http:// stackoverflow。com/questions/19120675/httpclient-task-was-cancelled-how-to-exact-error-message) – Fabio
あなたが取得している例外はおそらくリクエストの一部がタイムアウトしたためです。あなたは非常に短時間で膨大なリクエストを送信していますが、これが起こることを期待してください。 1つのリクエストがタイムアウトするとどうなるでしょうか?また、ある瞬間のアクティブなリクエスト数を妥当な数値に制限するべきではありません。 10? –