C# 任务的同步上下文
一篇关于SynchronizationContext的评论指出,SynchronizationContext决定了任务是作为单独的线程运行还是在一个线程上运行,但在任何回答中都没有提到这一点,也没有提到任务何时会在单独的线程上并行运行,或者只是在同一个线程上运行,但在等待IO时可能会在它们之间共享工作 特别是,我想在这个上下文中比较线程对象和任务对象,无论它们的行为相同还是不同 如何异步和等待连接或不连接到这将是有益的 举个例子,假设我有两个动作: f:忙非IO循环一秒钟 g:睡一会儿 让我们假设我有一个CPU,它的核心数量非常多 给定以下代码,无论是h=f还是h=g,运行yes都需要将近1秒的时间C# 任务的同步上下文,c#,.net,multithreading,task,threadpool,C#,.net,Multithreading,Task,Threadpool,一篇关于SynchronizationContext的评论指出,SynchronizationContext决定了任务是作为单独的线程运行还是在一个线程上运行,但在任何回答中都没有提到这一点,也没有提到任务何时会在单独的线程上并行运行,或者只是在同一个线程上运行,但在等待IO时可能会在它们之间共享工作 特别是,我想在这个上下文中比较线程对象和任务对象,无论它们的行为相同还是不同 如何异步和等待连接或不连接到这将是有益的 举个例子,假设我有两个动作: f:忙非IO循环一秒钟 g:睡一会儿 让我们假
Thread x1 = new Thread(h);
Thread x2 = new Thread(h);
Thread x3 = new Thread(h);
Thread x4 = new Thread(h);
Thread x5 = new Thread(h);
x1.Start();
x2.Start();
x3.Start();
x4.Start();
x5.Start();
x1.Join();
x2.Join();
x3.Join();
x4.Join();
x5.Join();
假设我对任务做了类似的事情:
Task x1 = new Task(h);
Task x2 = new Task(h);
Task x3 = new Task(h);
Task x4 = new Task(h);
Task x5 = new Task(h);
x1.Start();
x2.Start();
x3.Start();
x4.Start();
x5.Start();
x1.Wait();
x2.Wait();
x3.Wait();
x4.Wait();
x5.Wait();
对于h=f和h=g的情况,此任务代码运行需要多长时间,如果需要,什么情况会产生差异,我如何控制它们
特别是,我想在这个上下文中比较线程对象和任务对象,无论它们的行为相同还是不同
它们与您的代码几乎相同
有:委托任务,运行代码;和承诺任务,这代表了
使用和创建的任务是。使用async和Wait创建的任务是
委托任务只是表示要运行的代码。它们与线程不同,但它们确实在线程上运行。使用示例代码,“开始”将在TaskScheduler.Current上启动这些任务,这可能与TaskScheduler.Default相同,这意味着它们将在线程池上运行。由于假设内核的数量非常多,那么您的委托任务代码基本上与手动线程代码相同,只是它们运行在线程池线程上,而不是您自己的线程上
另一方面,使用任务构造函数和Start是非常低级的,它甚至没有任何用例;您永远不应该使用任务构造函数,因为无论您尝试做什么,总会有更好的解决方案。查看中的高级基本体。在您的情况下,您可以使用以下工具执行相同的操作:
评论不用于扩展讨论;这段对话已经结束。
Parallel.Invoke(h, h, h, h, h);