发送许多并行WebRequests

时间:2017-06-23 07:35:37

标签: c# .net multithreading webrequest

我正在尝试模拟许多并发用户(> 2000)来测试Web服务。每个用户都在特定的预定义时间执行操作,例如:

  • 用户A:09:10:02,09:10:03,09:10:08
  • 用户B:09:10:03,09:10:05,09:10:07
  • 用户C:09:10:03,09:10:09,09:10:15,09:10:20

我现在想要在每个时间实时发送网页请求。我可以忍受最多约2秒的延迟。我没有成功的尝试:

a)在单个列表中聚合所有时间,按时间排序然后迭代它:

foreach (DateTime sendTime in times) {
    while (DateTime.now < sendTime)
        Thread.Sleep(1);
    SendRequest();
}

b)为每个用户创建一个线程,每个线程检查与上面相同的条件但是更长的睡眠时间

两种方法都有点工作,但是应该发送请求的时间与实际发送请求的时间之间的延迟太高了。有没有办法以更高的精度发送请求?

编辑:建议方法非常有效。但是,许多请求的延迟仍然非常高。显然,原因是我的SendRequest()方法:

private static async Task SendRequest()
{
    // Log time difference
    string url = "http://www.request.url/newaction";
    WebRequest webRequest = WebRequest.Create(url);
    try
    {
        WebResponse webResponse = await webRequest.GetResponseAsync();
    }
    catch (Exception e) { }
 }

请注意,我的网络服务不会返回任何响应,也许这是减速的原因?我可以在不等待回复的情况下发送请求吗?

2 个答案:

答案 0 :(得分:2)

我建议使用计时器对象来触发请求:

DELETE

答案 1 :(得分:2)

为什么你用多线程做这个?线程需要慢速睡眠/唤醒上下文切换。您可以使用定时器/异步调用完成所有操作。

List<DateTime> scheduledTimes = ...;
List<Task> requests = scheduledTimes
                         .Select(t => t - DateTime.Now)
                         .Select(async delay => 
                         {
                             await Task.Delay(delay);
                             SendRequest();
                         })
                         .ToList();

await Task.WhenAll(requests);

以上代码将在一个线程中将所有请求安排到SynchronizationContext并运行它们。

Simples。