我想知道线程和任务之间的区别。除了简单的逻辑之外,还打印了两个线程和两个任务的结束时间。两个任务的结束时间相同。我有一个代码。当两个线程执行时,两个任务的结束时间相同。因为任务执行异步并行,所以我认为任务的结束时间将是线程的一半。我的想法有什么错误?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 关注
- 93 浏览
添加回答
举报
0/150
提交
取消