我正在使用 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 中,但在我的一生中,我在我的代码中看不到任何共享状态。有没有人有任何想法?
谢谢,埃里克