亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么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 關注
  • 119 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號