我正在尝试模拟许多并发用户(> 2000)来测试Web服务。每个用户都在特定的预定义时间执行操作,例如:
我现在想要在每个时间实时发送网页请求。我可以忍受最多约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) { }
}
请注意,我的网络服务不会返回任何响应,也许这是减速的原因?我可以在不等待回复的情况下发送请求吗?
答案 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。