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

标签 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();

最佳答案

您可以向任务 添加延续。 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/

相关文章:

javascript - 未捕获的语法错误 : Unexpected end of input Google Charts

c# - 带有 ASP.NET 按钮回发的 jQuery UI 对话框

C# - 一个线程无限循环的多线程

swift - 如何找出哪个函数卡在主线程上

multithreading - 每个核心的多个线程中存在的并行度

python - Python中ThreadPoolExecutor上下文中的轻量级持久化

C#动态添加数组到数组

C# 双格式对齐小数点

c - 一个线程控制多个其他线程

C#.NET 3.5 : What is Expression<> used for?