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

时间:2019-11-26 17:07:34

标签: c# performance-testing

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

例外:“线程已取消”
内部例外:“对象引用未设置为对象的实例。” 发生异常的代码:await(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;
}

1 个答案:

答案 0 :(得分:0)

根据文档,默认情况下MaxConnectionsPerServerHttpClient属性的值为256。因此,为了实现所需的功能,必须将此值更改为更大的数字。

https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclienthandler.maxconnectionsperserver?view=netcore-2.0#System_Net_Http_HttpClientHandler_MaxConnectionsPerServer

例如。
var client = new HttpClient(new HttpClientHandler { MaxConnectionsPerServer = 1000 });