C# 发送多个并行Web请求

C# 发送多个并行Web请求,c#,.net,multithreading,webrequest,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 现在,我想在每一次都实时发送web请求。我最多可以忍受约2秒的延迟。我已经尝试过但没有成功: a) 在单个列表中聚合所有时间,按时间排序,然后迭代: foreach (DateTime send

我试图模拟许多并发用户(>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
现在,我想在每一次都实时发送web请求。我最多可以忍受约2秒的延迟。我已经尝试过但没有成功:

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

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

请注意,我的web服务没有返回任何响应,可能这就是速度减慢的原因?我可以在不等待响应的情况下发送请求吗?

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

// In Form_Load or another init method
Timer tRequest = new Timer();
tRequest.Interval = 500;
tRequest.Tick += TRequest_Tick;

private void TRequest_Tick(object sender, EventArgs e)
{
     var sendTimes = times.Where(t => t.AddMilliseconds(-500) < DateTime.Now && t.AddMilliseconds(500) > DateTime.Now);

     foreach(DateTime sendTime in sendTimes)
     {
         SendRequest();
     }
}
//以加载或其他初始化方法的形式
Timer tRequest=新定时器();
时间间隔=500;
tRequest.Tick+=tRequest_Tick;
私有void TRequest_Tick(对象发送方,事件参数e)
{
var sendTimes=times.Where(t=>t.addmillizes(-500)DateTime.Now);
foreach(发送时间中的日期时间发送时间)
{
SendRequest();
}
}

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

// In Form_Load or another init method
Timer tRequest = new Timer();
tRequest.Interval = 500;
tRequest.Tick += TRequest_Tick;

private void TRequest_Tick(object sender, EventArgs e)
{
     var sendTimes = times.Where(t => t.AddMilliseconds(-500) < DateTime.Now && t.AddMilliseconds(500) > DateTime.Now);

     foreach(DateTime sendTime in sendTimes)
     {
         SendRequest();
     }
}
//以加载或其他初始化方法的形式
Timer tRequest=新定时器();
时间间隔=500;
tRequest.Tick+=tRequest_Tick;
私有void TRequest_Tick(对象发送方,事件参数e)
{
var sendTimes=times.Where(t=>t.addmillizes(-500)DateTime.Now);
foreach(发送时间中的日期时间发送时间)
{
SendRequest();
}
}

为什么要使用多线程执行此操作?线程需要缓慢的睡眠/唤醒上下文切换。您可以通过定时器/异步调用来完成这一切

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);
List scheduledTimes=。。。;
列表请求=计划时间
.Select(t=>t-DateTime.Now)
.选择(异步延迟=>
{
等待任务。延迟(延迟);
SendRequest();
})
.ToList();
等待任务。何时(请求);
上述代码将在一个线程中调度所有请求到
SynchronizationContext
并运行它们


简单。

为什么要使用多线程执行此操作?线程需要缓慢的睡眠/唤醒上下文切换。您可以通过定时器/异步调用来完成这一切

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);
List scheduledTimes=。。。;
列表请求=计划时间
.Select(t=>t-DateTime.Now)
.选择(异步延迟=>
{
等待任务。延迟(延迟);
SendRequest();
})
.ToList();
等待任务。何时(请求);
上述代码将在一个线程中调度所有请求到
SynchronizationContext
并运行它们


简单。

您的问题呢?我添加了一个更具体的问题,您的问题呢?我添加了一个更具体的问题谢谢,这非常有效。但是,由于我的SendRequest()方法,许多请求的延迟仍然很高。我编辑我的文章是为了获得更多信息。@A我想实际上原因是因为你达到了connectionManager的极限。也有可能您正在达到http服务器的限制(非服务器窗口上的IIS也故意受到连接限制的限制)。我如何检查是否存在这种情况?我已经增加了我的App.config中的maxconnection属性、我的服务的IIS连接限制和应用程序池queueLength。@aseipel您在IIS上运行的Windows版本是什么?您可以通过卸载Windows并安装Windows的服务器版本来更改这些限制。我在Windows 7上运行了服务和测试应用程序。但是,我现在已经使用Windows Server 2016在两台不同的服务器上部署了这两个程序。在请求中,我发送了两个时间戳:a)应该发送请求的时间(在scheduledTimes列表中确定)以及实际发送请求的时间。事实证明,发送请求的应用程序太慢,因为实际发送/接收之间的差异接近于零,而应该发送/接收之间的差异一直在上升。谢谢,这非常有效。但是,由于我的SendRequest()方法,许多请求的延迟仍然很高。我编辑我的文章是为了获得更多信息。@A我想实际上原因是因为你达到了connectionManager的极限。也有可能您正在达到http服务器的限制(非服务器窗口上的IIS也故意受到连接限制的限制)。我如何检查是否存在这种情况?我已经增加了我的App.config中的maxconnection属性、我的服务的IIS连接限制和应用程序池queueLength。@aseipel您在IIS上运行的Windows版本是什么?您可以通过卸载Windows并安装Windows的服务器版本来更改这些限制。我在Windows 7上运行了服务和测试应用程序。但是,我现在已经使用Windows Server 2016在两台不同的服务器上部署了这两个程序。在请求中,我发送了两个时间戳:a)应该发送请求的时间(在scheduledTimes列表中确定)以及实际发送请求的时间。事实证明,发送请求的应用程序速度太慢,因为实际发送/接收之间的差异接近于零,而应该发送/接收之间的差异却一直在上升