我想知道線程和任務之間的區別。除了簡單的邏輯之外,還打印了兩個線程和兩個任務的結束時間。兩個任務的結束時間相同。我有一個代碼。當兩個線程執行時,兩個任務的結束時間相同。因為任務執行異步并行,所以我認為任務的結束時間將是線程的一半。我的想法有什么錯誤?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();
- 1 回答
- 0 關注
- 119 瀏覽
添加回答
舉報
0/150
提交
取消