我想知道線程和任務(wù)之間的區(qū)別。除了簡(jiǎn)單的邏輯之外,還打印了兩個(gè)線程和兩個(gè)任務(wù)的結(jié)束時(shí)間。兩個(gè)任務(wù)的結(jié)束時(shí)間相同。我有一個(gè)代碼。當(dāng)兩個(gè)線程執(zhí)行時(shí),兩個(gè)任務(wù)的結(jié)束時(shí)間相同。因?yàn)槿蝿?wù)執(zhí)行異步并行,所以我認(rèn)為任務(wù)的結(jié)束時(shí)間將是線程的一半。我的想法有什么錯(cuò)誤?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 回答

動(dòng)漫人物
TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊
Task
代表一些應(yīng)該完成的工作。Thread
是一個(gè)處理單元。任務(wù)可以在線程上執(zhí)行。這取決于工作負(fù)載類(lèi)型。
有兩種類(lèi)型的工作:1.
IO(網(wǎng)絡(luò)請(qǐng)求、數(shù)據(jù)庫(kù)查詢等)和2.
CPU(任何類(lèi)型的計(jì)算)。async/await
在正確使用的第一種情況下,沒(méi)有占用的線程。在第二種情況下 - 您仍然需要一個(gè)線程來(lái)完成工作。
在您的代碼中,您CommonCode
使用兩個(gè)線程然后使用兩個(gè)任務(wù)并行運(yùn)行方法。CommonCode
是 CPU 密集型工作負(fù)載,它是同步代碼。所以在這兩種情況下你仍然需要一個(gè)線程。預(yù)計(jì)這里沒(méi)有差異。
但對(duì)于任務(wù)來(lái)說(shuō),它可以寫(xiě)得更優(yōu)雅:
Task.WhenAll(Task1(),?Task2()).GetAwaiter().GetResult();
- 1 回答
- 0 關(guān)注
- 118 瀏覽
添加回答
舉報(bào)
0/150
提交
取消