Thread内的DateTime差异

时间:2017-05-15 11:26:32

标签: c# .net multithreading datetime restsharp

我有一个for循环,每次迭代都会创建一个新的Thread。简而言之,我的循环创建了20个线程,可以同时执行某些操作。

我在每个线程中的目标是创建一个带有开始时间的DateTime变量,执行一个操作,并创建一个带有结束时间的DateTime变量。此后,我将了解这两个变量之间的差异,以找出此操作在此SPECIFIC线程中花了多长时间。然后注销。

然而,这并没有按预期工作,我对原因感到困惑。 看起来它只是“添加”变量的时间,新线程的每次迭代,而不是创建一个全新的变量版本,只是在该特定线程中考虑。

这是我的for-loop代码:

for(int i = 0; i < 20; i++)
{
    Thread thread = new Thread(() =>
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        RESTRequest(Method.POST, ....), 
        sw.Stop();

        Console.WriteLine("Result took (" + sw.Elapsed.Seconds + " seconds, " + sw.Elapsed.Milliseconds + " milliseconds)");
    });
    thread.IsBackground = true;
    thread.Start();
}

长时间操作功能

public static string RESTRequest(Method method, string endpoint, string resource, string body, SimplytureRESTRequestHeader[] requestHeaders = null, SimplytureRESTResponseHeader[] responseHeaders = null, SimplytureRESTAuthentication authentication = null, SimplytureRESTParameter[] parameters = null)
{
    var client = new RestClient(endpoint);

    if(authentication != null)
    {
        client.Authenticator = new HttpBasicAuthenticator(authentication.username, authentication.password);
    }

    var request = new RestRequest(resource, method);

    if (requestHeaders != null)
    {
        foreach (var header in requestHeaders)
        {
            request.AddHeader(header.headerType, header.headerValue);
        }
    }

    if(body != null)
    {
        request.AddParameter("text/json", body, ParameterType.RequestBody);
    }

    if(parameters != null)
    {
        foreach (var parameter in parameters)
        {
            request.AddParameter(parameter.key, parameter.value);
        }
    }

    IRestResponse response = client.Execute(request);

    if (responseHeaders != null)
    {
        foreach (var header in responseHeaders)
        {
            var par = new Parameter();
            par.Name = header.headerType;
            par.Value = header.headerValue;

            response.Headers.Add(par);
        }
    }

    var content = response.Content;

    return content;
}

这是我的结果:

enter image description here

修改 我也试过使用秒表类,但它没有任何区别,但绝对更方便。我还添加了长调试操作。

1 个答案:

答案 0 :(得分:3)

对同一ServicePoint的并发调用存在限制。

每个唯一ServicePoint的默认值为2个并发连接。

添加System.Net.ServicePointManager.DefaultConnectionLimit = 20;以提高该限制以匹配线程数。

System.Net.ServicePointManager.DefaultConnectionLimit

您也可以在配置文件中设置此值

<system.net>
  <connectionManagement>
    <add address="*" maxconnection="20" />
  </connectionManagement>
</system.net>