对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 = f
和h = g
,此任务代码需要花费多长时间运行,并且取决于情况,什么情况会有所作为以及如何控制它们?
答案 0 :(得分:1)
尤其是在这种情况下,我正在寻找Thread对象和Task对象之间的比较,无论它们的行为相同还是不同。
它们与您拥有的代码几乎相同。
有two different kinds of Tasks:委托任务,运行代码;和Promise Tasks,它们代表一个Future。
使用Task
constructor和Start
创建的任务为Delegate Tasks。使用async
和await
创建的任务是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);