首页 > 解决方案 > 为什么Thread和Task的逻辑结束时间相等?

问题描述

我想知道线程和任务之间的区别。

除了简单的逻辑,还打印了两个线程和两个任务的结束时间。两个任务的结束时间相同。

我有一个代码。

当执行两个线程时,结束时间与两个任务相同。

因为任务执行异步并行,我认为任务的结束时间将是线程的一半。

我的想法有什么错误?

class Program
{
    static ConcurrentBag<string> cb = new ConcurrentBag<string>();

    static System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();

    static void Main(string[] args)
    {
        sw.Start();

        // no.1 Thread  
        Thread1();
        Thread2();

        // no.2 Task
        //Task1();
        //Task2();

        while (true)
        {
            if (cb.Count == 1000000)
            {
                sw.Stop();

                Console.WriteLine($"{cb.First()} Completed -> Time : {sw.ElapsedMilliseconds}");
                break;
            }
        }

        Console.ReadKey(true);
    }

    static void CommonCode(string msg)
    {
        for (int i = 0; i < 500000; i++)
            cb.Add(msg);
    }

    static void Thread1()
    {
        Thread t = new Thread(() => {
            CommonCode("Thread");
        });
        t.Start();
    }

    static void Thread2()
    {
        Thread t = new Thread(() => {
            CommonCode("Thread");
        });
        t.Start();
    }

    static async void Task1()
    {
        await Task.Run(() => {
            CommonCode("Task");
        });
    }

    static async void Task2()
    {
        await Task.Run(() => {
            CommonCode("Task");
        });
    }

}

标签: c#multithreadingasynchronousparallel-processingtask

解决方案


Task表示应该完成的一些工作。Thread是一个处理单元。任务可以在线程上执行。这取决于工作负载类型。

有两种类型的工作:1.IO(网络请求、数据库查询等)和2.CPU(任何类型的计算)。在正确async/await使用的第一种情况下,没有占用的线程。在第二种情况下 - 你仍然需要一个线程来完成这项工作。

在您的代码中,您CommonCode使用两个线程并行运行方法,然后使用两个任务。CommonCode是一个 CPU 绑定的工作负载,它是一个同步代码。所以在这两种情况下你仍然需要一个线程。预计这里没有区别。

但是对于任务,它可以写得更优雅:

Task.WhenAll(Task1(), Task2()).GetAwaiter().GetResult();

推荐阅读