为什么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");

        });

    }


}


慕村225694
浏览 94回答 1
1回答

动漫人物

Task代表一些应该完成的工作。Thread是一个处理单元。任务可以在线程上执行。这取决于工作负载类型。有两种类型的工作:1.IO(网络请求、数据库查询等)和2.CPU(任何类型的计算)。async/await在正确使用的第一种情况下,没有占用的线程。在第二种情况下 - 您仍然需要一个线程来完成工作。在您的代码中,您CommonCode使用两个线程然后使用两个任务并行运行方法。CommonCode是 CPU 密集型工作负载,它是同步代码。所以在这两种情况下你仍然需要一个线程。预计这里没有差异。但对于任务来说,它可以写得更优雅:Task.WhenAll(Task1(), Task2()).GetAwaiter().GetResult();
打开App,查看更多内容
随时随地看视频慕课网APP