我想创建一个循环来测试Web客户端。我有一个HttpClient,我想发送100个请求,每3秒发送一次。
我发送请求的功能是(async Task
,因为PostAsync
):
private static async Task SendRequestAsync(HttpClient client, int taskID)
{
try
{
String xmlData = GetXmlData();
var content = new StringContent(xmlData);
HttpResponseMessage response = await client.PostAsync("sendRequest.ashx?RequestId=" + taskID, content);
// write response in a file
}
catch (Exception e)
{
}
}
现在我要:
我写了一段代码。这是可行的,但是经过一些迭代(并非总是相同)后,我有了一个TaskCanceledException
:
List<Task> listTask = new List<Task>();
using (HttpClientHandler handler = new HttpClientHandler())
{
HttpClient client = new HttpClient(handler)
{
BaseAddress = new Uri(urlRequest)
};
client.DefaultRequestHeaders.Accept.Clear();
int cpt = 0;
while (cpt < 100)
{
cpt++;
int tmp = cpt;
listTask.Add(Task.Run(() => SendRequestAsync(client, tmp)));
Thread.Sleep(3000);
}
}
Task.WaitAll(listTask.ToArray());
TaskCanceledException
的起因是什么,我该如何解决?
编辑
经过一些调查,我发现我在对象System.ObjectDisposedException
中有一个System.Net.Sockets.NetworkStream
,但是我无法识别引发此异常的线程。
有没有办法使此异常来自我的HttpClientHandler handler
?在那种情况下,如何重新创建对象以继续循环?
答案 0 :(得分:0)
考虑添加一个Task.WaitAll(listTask);
并删除Thread.Sleep(3000)
此外,您可以考虑使用任务并行库,尤其是Parrell.ForEach