线程内的日期时间差异
DateTime difference inside Thread
我有一个 for 循环,每次迭代都会创建一个新线程。简而言之,我的循环正在创建 20 个同时执行某些操作的线程。
我在每个线程中的目标是创建一个具有开始时间的 DateTime 变量,执行一个操作,并创建一个具有结束时间的 DateTime 变量。此后,我将利用这两个变量之间的差异来找出此操作在此特定线程中花费了多长时间。然后登出。
然而,这并没有按预期工作,我对原因感到困惑。
似乎只是 "adds" 变量的时间,新线程的每次迭代,而不是创建变量的全新版本,只在该特定线程中考虑。
这是我的for循环代码:
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;
}
这是我的结果:
编辑:
我也尝试使用秒表 class,但它没有任何区别,但绝对更方便。我还添加了用于调试的长操作。
对同一 ServicePoint 的并发调用存在限制。
每个唯一 ServicePoint 默认为 2 个并发连接。
添加 System.Net.ServicePointManager.DefaultConnectionLimit = 20;
以提高该限制以匹配线程数。
System.Net.ServicePointManager.DefaultConnectionLimit
您也可以在配置文件中设置这个值
<system.net>
<connectionManagement>
<add address="*" maxconnection="20" />
</connectionManagement>
</system.net>
我有一个 for 循环,每次迭代都会创建一个新线程。简而言之,我的循环正在创建 20 个同时执行某些操作的线程。
我在每个线程中的目标是创建一个具有开始时间的 DateTime 变量,执行一个操作,并创建一个具有结束时间的 DateTime 变量。此后,我将利用这两个变量之间的差异来找出此操作在此特定线程中花费了多长时间。然后登出。
然而,这并没有按预期工作,我对原因感到困惑。 似乎只是 "adds" 变量的时间,新线程的每次迭代,而不是创建变量的全新版本,只在该特定线程中考虑。
这是我的for循环代码:
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;
}
这是我的结果:
编辑: 我也尝试使用秒表 class,但它没有任何区别,但绝对更方便。我还添加了用于调试的长操作。
对同一 ServicePoint 的并发调用存在限制。
每个唯一 ServicePoint 默认为 2 个并发连接。
添加 System.Net.ServicePointManager.DefaultConnectionLimit = 20;
以提高该限制以匹配线程数。
System.Net.ServicePointManager.DefaultConnectionLimit
您也可以在配置文件中设置这个值
<system.net>
<connectionManagement>
<add address="*" maxconnection="20" />
</connectionManagement>
</system.net>