我有一个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;
}
这是我的结果:
修改 我也试过使用秒表类,但它没有任何区别,但绝对更方便。我还添加了长调试操作。
答案 0 :(得分:3)
对同一ServicePoint的并发调用存在限制。
每个唯一ServicePoint的默认值为2个并发连接。
添加System.Net.ServicePointManager.DefaultConnectionLimit = 20;
以提高该限制以匹配线程数。
System.Net.ServicePointManager.DefaultConnectionLimit
您也可以在配置文件中设置此值
<system.net>
<connectionManagement>
<add address="*" maxconnection="20" />
</connectionManagement>
</system.net>