为了账号安全,请及时绑定邮箱和手机立即绑定

为什么Thread和Task的逻辑结束时间相等?

为什么Thread和Task的逻辑结束时间相等?

C#
慕村225694 2023-08-13 14:07:15
我想知道线程和任务之间的区别。除了简单的逻辑之外,还打印了两个线程和两个任务的结束时间。两个任务的结束时间相同。我有一个代码。当两个线程执行时,两个任务的结束时间相同。因为任务执行异步并行,所以我认为任务的结束时间将是线程的一半。我的想法有什么错误?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");        });    }}
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

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

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

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

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

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


查看完整回答
反对 回复 2023-08-13
  • 1 回答
  • 0 关注
  • 93 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信