我正在使用任务工厂生成并行线程,我的代码如下。我需要打印每个线程的完成时间,但不知道如何检查每个线程。目前我的代码正在等待所有任务完成,然后计算时间。
stp1.Start();
for (int i = 0; i < tsk.Length; i++)
{
tsk[i] = Task.Factory.StartNew((object obj) =>
{
resp = http.SynchronousRequest(web, 443, true, req);
}, i);
}
try
{
Task.WaitAll(tsk);
}
stp1.Stop();
最佳答案
您可以向任务
添加延续。 Continuation 是一种在给定的 Task
完成时调用的方法。
for (int i = 0; i < tsk.Length; i++)
{
tsk[i] = Task.Factory.StartNew((object obj) =>
{
resp = http.SynchronousRequest(web, 443, true, req);
}, i);
tsk[i].ContinueWith(antecedent=>
{
//antecedent is completed
//Do whatever here
});
}
如果您需要为单个任务计时,则每个任务需要一个秒表。您可以在 StartNew
中启动 StopWatch
并在 ContinueWith
中停止它。
如果这是您的实际代码,您可以简单地为您调用的同步操作计时(在本例中为 http.SynchronousRequest)。例如下面的代码就足够了。
for (int i = 0; i < tsk.Length; i++)
{
tsk[i] = Task.Factory.StartNew((object obj) =>
{
StopWatch watch = StopWatch.StartNew();
resp = http.SynchronousRequest(web, 443, true, req);
watch.Stop();
Console.WriteLine(watch.Elapsed);
}, i);
}
顺便说一句,网络操作本质上是异步的;将有可用的异步 API,您可以使用它而不是在 Task 中包装同步 Web 请求。例如,可能是 HttpClient.SendAsync
。
关于c# - 使用任务工厂存储每个任务的任务完成时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29667999/