c# - 为什么Thread和Task的逻辑结束时间相等?
问题描述
我想知道线程和任务之间的区别。
除了简单的逻辑,还打印了两个线程和两个任务的结束时间。两个任务的结束时间相同。
我有一个代码。
当执行两个线程时,结束时间与两个任务相同。
因为任务执行异步并行,我认为任务的结束时间将是线程的一半。
我的想法有什么错误?
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");
});
}
}
解决方案
Task
表示应该完成的一些工作。Thread
是一个处理单元。任务可以在线程上执行。这取决于工作负载类型。
有两种类型的工作:1.
IO(网络请求、数据库查询等)和2.
CPU(任何类型的计算)。在正确async/await
使用的第一种情况下,没有占用的线程。在第二种情况下 - 你仍然需要一个线程来完成这项工作。
在您的代码中,您CommonCode
使用两个线程并行运行方法,然后使用两个任务。CommonCode
是一个 CPU 绑定的工作负载,它是一个同步代码。所以在这两种情况下你仍然需要一个线程。预计这里没有区别。
但是对于任务,它可以写得更优雅:
Task.WhenAll(Task1(), Task2()).GetAwaiter().GetResult();
推荐阅读
- google-analytics - Google Analytics 请求的身份验证范围不足
- flutter - 如何使用正确的包装从抖动的图像中读取 QR 码?
- java - 回收站视图未与 Tablayout 正确对齐
- ffmpeg - 如何减慢 ffmpeg 编码速度?
- python - 如何从数据库中返回值
- python - 查找文本的正则表达式
- xml - 如何在 Marklogic 中使用元素值中的特殊字符加载 xml 文件?
- java - Selenium webdriver 正在查看 Chrome.exe 的错误路径
- r - 如何从包含数字和单词的 url 获取电影 ID?
- html - 我该如何处理这样的表格边框?