System.Net.Httpを使用してネットワークリソースを使用しています。シングルスレッドで実行すると、完全に機能します。TPLを介してコードを実行すると、コードがハングし、タイムアウトになるまで完了しません。
何が起こるかというと、すべてのスレッドがsendTask.Result行で待機することになります。彼らが何を待っているのかはわかりませんが、HttpClientにあるものだと思います。
ネットワークコードは次のとおりです。
using (var request = new HttpRequestMessage(HttpMethod.Get, "http://google.com/"))
{
using (var client = new HttpClient())
{
var sendTask = client.SendAsync
(request, HttpCompletionOption.ResponseHeadersRead);
using (var response = sendTask.Result)
{
var streamTask = response.Content.ReadAsStreamAsync();
using (var stream = streamTask.Result)
{
// problem occurs in line above
}
}
}
}
私が使用しているTPLコードは次のとおりです。Doメソッドには、上記のコードが正確に含まれています。
var taskEnumerables = Enumerable.Range(0, 100);
var tasks = taskEnumerables.Select
(x => Task.Factory.StartNew(() => _Do(ref count))).ToArray();
Task.WaitAll(tasks);
いくつかの異なるスケジューラーを試しましたが、それを機能させる唯一の方法は、実行中のタスクの数を2または3に制限するスケジューラーを作成することです。ただし、これでも失敗することがあります。
私の問題はHttpClientにあると思いますが、私の人生の間、コードに共有状態を表示することはできません。誰かアイデアはありますか?
ありがとう、エリック