【发布时间】:2017-04-29 15:41:59
【问题描述】:
我开发了一个小型客户端 (WPF) 来对我们的系统进行一些压力测试。本质上,它必须在 Asp.Net WebApi 端点上并行调用各种方法。
每次您按下“开始”时,它会生成 4000 个任务(异步 - 等待)与压力请求并行,等待它们全部完成,然后再次执行 - 直到用户单击停止按钮。 GUI 装饰有进度条和一些计数器:错误请求、已完成请求、正在进行的请求。我之所以获得这些信息,是因为发出这批压力请求的对象暴露了一些事件:
var stressTestTask = new stressTestTask(LogService, configuration);
stressTestTask.ErrorRequestCountChanged += stressTestTask_ErrorRequestCountChanged;
stressTestTask.GoodRequestCountChanged += stressTestTask_GoodRequestCountChanged;
stressTestTask.TryRequestCountChanged += stressTestTask_TryRequestCountChanged;
_executionCancellationToken = new CancellationTokenSource();
await Task.Run(
() => stressTestTask.ApiStressTestTask(_executionCancellationToken.Token),
_executionCancellationToken.Token);
整个执行从一个ICommand(MVVM)开始:
private RelayCommand _startCommand;
public RelayCommand StartCommand
{
get
{
return _startCommand ?? (_startCommand = new RelayCommand(
async () =>
{
await StartStressTest();
}));
}
}
RelayCommand 是库Mvvm-Light 中ICommand 的实现。
我不明白这种行为:如果我用“低”数量的任务(例如 2000)配置我的一批任务,则 GUI 在执行时不会冻结。相反,如果我选择 5000 个任务,那么它会在一段时间后冻结。如果然后我打开我的客户端的另一个 .exe 实例并在每个实例上选择 2000,则 GUI 对两者都有响应。
我的第一个问题是:为什么用x 任务打开一个实例在响应性方面比用x/n 任务打开n 实例更差?是否与 Windows 调度程序有关,以及在第一种情况下我只有一个进程?
我的第二个问题是:我怎样才能解决这个问题,让一切都在一个 GUI 上运行?我想过用单批压力测试制作一个控制台应用程序,并为我想要的每个实例从 GUI 调用一个命令,以便为每批生成一个进程。
【问题讨论】:
-
您是否使用
HttpClient调用端点?如果是这样,请记住HttpClient使用HttpWebRequest,默认限制为每台主机 2 个并发连接。因此,如果连接数量越多,您的测试客户端的多个实例就会获得更好的总吞吐量。 -
我正在从 WCF xsd 定义中调用自动生成的客户端。但是你的评论很有趣。
标签: c# wpf windows async-await task