使用任务工厂存储每个任务的任务完成时间

pri*_*iya 7 c# multithreading

我正在使用任务工厂生成并行线程,我的代码如下.我有要求打印每个线程的完成时间,但不知道如何检查每个线程.目前我的代码正在等待所有任务完成,然后计算时间.

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();
Run Code Online (Sandbox Code Playgroud)

Sri*_*vel 7

你可以添加一个延续Task.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                
    });
}
Run Code Online (Sandbox Code Playgroud)

如果您需要为单个任务计时,每个任务需要一个秒表.你可以从StopWatch内部开始StartNew并将其停止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);
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,网络操作本质上是异步的; 将提供异步API,您可以使用它而不是在Task中包装同步Web请求.例如,也许吧HttpClient.SendAsync.