任务的SynchronizationContext

时间:2019-06-11 11:02:22

标签: c# .net multithreading task threadpool

my question的评论表明,“ SynchronizationContext”决定了任务是作为单独的线程运行还是在一个线程上运行,但这并未在this question的任何答案中提及,也没有在何时提供任何细节。任务实际上将在单独的线程上并行运行,或者仅在同一线程上运行,但是在等待IO时也许在它们之间共享工作。

尤其是在这种情况下,我正在寻找Thread对象和Task对象之间的比较,无论它们的行为相同还是不同。

“异步”和“等待”如何连接(或不连接)对此也将有所帮助。

举个说明性的例子,假设我有两个动作:

f:繁忙的非IO循环持续一秒钟
g:睡眠一秒钟

并假设我的CPU的核心数量非常荒谬。

给出以下代码,无论是h = f还是h = g,运行yes都需要接近一秒钟的时间?

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 = fh = g,此任务代码需要花费多长时间运行,并且取决于情况,什么情况会有所作为以及如何控制它们?

1 个答案:

答案 0 :(得分:1)

  

尤其是在这种情况下,我正在寻找Thread对象和Task对象之间的比较,无论它们的行为相同还是不同。

它们与您拥有的代码几乎相同。

two different kinds of Tasks:委托任务,运行代码;和Promise Tasks,它们代表一个Future

使用Task constructorStart创建的任务为Delegate Tasks。使用asyncawait创建的任务是Promise Tasks

代理任务仅代表要运行的代码。它们与线程不同,但是它们确实在线程上运行。在您的示例代码中,Start将在TaskScheduler.Current上运行这些任务,这与TaskScheduler.Default 可能相同,这意味着它们将在线程池上运行。由于您假设内核数量荒谬,因此您的Delegate Task代码与手动Thread代码基本相同,除了它们在线程池线程而不是您自己的线程上运行之外。

另一方面,使用Task构造函数和Start太低级了,甚至没有用例。您永远不要使用Task构造函数,因为无论您想做什么,总是有一个更好的解决方案。在Task Parallel Library documentation中检出更高级别的原语。就您而言,您可以使用single line of code做同样的事情:

Parallel.Invoke(h, h, h, h, h);