C# 使用Task.WhenAll()的多个请求
我试图对上传到Azure的WebApi进行压力测试。具体来说,此测试用于登录应用程序。我决定使用c#创建一个模拟客户端,并创建一个任务列表,每个任务都会向我的WebApi发送相同的请求。我的问题是,它在使用了300多个任务之后抛出了一个异常 异常:“线程已被取消”C# 使用Task.WhenAll()的多个请求,c#,performance-testing,C#,Performance Testing,我试图对上传到Azure的WebApi进行压力测试。具体来说,此测试用于登录应用程序。我决定使用c#创建一个模拟客户端,并创建一个任务列表,每个任务都会向我的WebApi发送相同的请求。我的问题是,它在使用了300多个任务之后抛出了一个异常 异常:“线程已被取消” 内部异常:“对象引用未设置为对象的实例。” 发生异常的代码:wait(Task.WhenAll(tasks)) 我是否在测试代码中出错?如果是,什么?如何纠正错误?谢谢 注: -我已尝试在本地针对API运行测试代码 -API代码被tr
内部异常:“对象引用未设置为对象的实例。” 发生异常的代码:wait(Task.WhenAll(tasks)) 我是否在测试代码中出错?如果是,什么?如何纠正错误?谢谢 注: -我已尝试在本地针对API运行测试代码 -API代码被try-catch块包围,在对其运行测试代码时,它没有命中catch块中设置的断点,测试代码中仍然抛出异常 -因为这是一个正在工作的项目,所以我用代理替换了真实的登录凭据和API的URL 下面是我的测试代码
public static async Task<decimal> LoginTestParallel3Async(){
Stopwatch timer = new Stopwatch();
var tasks = new List<Task>();
LoginRequestModel request = new LoginRequestModel();
int numOfRequests = 500;
decimal totalTimeForTasks = 0;
string jsonObject = "";
request.UserName = "User";
request.Password = "Password";
request.UserId = 0;
jsonObject = Newtonsoft.Json.JsonConvert.SerializeObject(request);
try
{
using (var client = new HttpClient())
{
for (int i = 0; i < numOfRequests; i++)
{
//tasks.Add(client.PostAsync("URLForAzure", new StringContent(jsonObject, Encoding.UTF8, "application/json")));
tasks.Add(client.PostAsync("URLForLocal", new StringContent(jsonObject, Encoding.UTF8, "application/json")));
}
timer.Start();
await (Task.WhenAll(tasks));
timer.Stop();
totalTimeForTasks = timer.ElapsedMilliseconds;
Console.WriteLine("total time for request: " + totalTimeForTasks + " milliseconds");
Console.ReadLine();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message.ToString());
return totalTimeForTasks;
}
return totalTimeForTasks;
}
公共静态异步任务LoginTestParallel3Async(){
秒表计时器=新秒表();
var tasks=新列表();
LoginRequestModel请求=新的LoginRequestModel();
int numOfRequests=500;
十进制TotalTimeortTasks=0;
字符串jsonObject=“”;
request.UserName=“User”;
request.Password=“Password”;
request.UserId=0;
jsonObject=Newtonsoft.Json.JsonConvert.SerializeObject(请求);
尝试
{
使用(var client=new HttpClient())
{
for(inti=0;i
根据文档,HttpClient
的MaxConnectionsPerServer
属性的值默认为256。因此,为了实现您所需要的,您必须将该值更改为更大的数字
例如var client=newhttpclient(newhttpclienthandler{MaxConnectionsPerServer=1000})代码>根据文档,HttpClient
中的MaxConnectionsPerServer
属性的值默认为256。因此,为了实现您所需要的,您必须将该值更改为更大的数字
例如
var client=newhttpclient(newhttpclienthandler{MaxConnectionsPerServer=1000})代码>这是我在用您提供的语句替换using语句后收到的新错误消息:e.message“发送请求时发生错误”。e.InnerException.message“无法连接到远程服务器”。嗯,此异常听起来像是防火墙或网络问题。我看不出它与此设置有什么关系。或者,由于对服务器的请求过多,您可能会面临阻塞。好的,谢谢您的帮助。我更改了代码,因此我有4个独立的客户端,每个客户端将执行250个请求。我将这些请求添加到任务列表中,并调用task.WhenAll。似乎有效。有人反对用这种方法来解决我的问题吗?这确实是一种更好的方法。使用一个客户端执行大量操作可能会对服务器造成很多限制。这是我在用您提供的语句替换using语句后收到的新错误消息:e.message“发送请求时出错”。e.InnerException.message“无法连接到远程服务器”,此异常听起来像是防火墙或网络问题。我看不出它与此设置有什么关系。或者,由于对服务器的请求过多,您可能会面临阻塞。好的,谢谢您的帮助。我更改了代码,因此我有4个独立的客户端,每个客户端将执行250个请求。我将这些请求添加到任务列表中,并调用task.WhenAll。似乎有效。有人反对用这种方法来解决我的问题吗?这确实是一种更好的方法。在一个客户机上做大量工作可能会对服务器造成很多限制。