Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Task.WhenAll()的多个请求_C#_Performance Testing - Fatal编程技术网

C# 使用Task.WhenAll()的多个请求

C# 使用Task.WhenAll()的多个请求,c#,performance-testing,C#,Performance Testing,我试图对上传到Azure的WebApi进行压力测试。具体来说,此测试用于登录应用程序。我决定使用c#创建一个模拟客户端,并创建一个任务列表,每个任务都会向我的WebApi发送相同的请求。我的问题是,它在使用了300多个任务之后抛出了一个异常 异常:“线程已被取消” 内部异常:“对象引用未设置为对象的实例。” 发生异常的代码:wait(Task.WhenAll(tasks)) 我是否在测试代码中出错?如果是,什么?如何纠正错误?谢谢 注: -我已尝试在本地针对API运行测试代码 -API代码被tr

我试图对上传到Azure的WebApi进行压力测试。具体来说,此测试用于登录应用程序。我决定使用c#创建一个模拟客户端,并创建一个任务列表,每个任务都会向我的WebApi发送相同的请求。我的问题是,它在使用了300多个任务之后抛出了一个异常

异常:“线程已被取消”
内部异常:“对象引用未设置为对象的实例。” 发生异常的代码: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。似乎有效。有人反对用这种方法来解决我的问题吗?这确实是一种更好的方法。在一个客户机上做大量工作可能会对服务器造成很多限制。