任务可以用于表示发生在多个线程上的操作,但它们不具有具有。一个可以编写只在单个线程中执行的复杂TPL应用程序。例如,当您有一项任务代表某些数据的网络请求时,该任务是而不是将创建其他线程来实现该目标。这样的程序(希望)是异步的,但不一定是多线程的。
并行性在同一时间做了不止一件事情。这可能是也可能不是多个线程的结果。
让我们在这里打个比方。
这里是鲍勃怎么做晚饭:
- 他填补了一锅水,并煮沸它。
- 然后他把意大利面放在水中。
- 完成后,他将意大利面排出。
- 他准备他的酱料。
- 他把所有酱料放在平底锅里。
- 他煮他的酱。
- 他把自己的酱放在他的意大利面上。
- 他吃晚饭。
鲍勃烹饪完晚餐时完全同步烹饪,没有多线程,异步或并行性。
这里是简如何做晚饭:
- 她充满了一盆水,并开始沸腾了。
- 她为她的酱汁准备食材。
- 她把面条在开水。
- 她把配料放在平底锅里。
- 她喝了她的面食。
- 她把酱油在她的面食。
- 她吃了她的晚餐。
珍在烹饪晚餐时利用异步烹饪(没有多线程)实现并行性。
这里是Servy如何做晚饭:
- 他告诉鲍勃烧开一锅水,放入面条准备好时,全心全意面食。
- 他告诉简准备配料酱,煮它,然后做的时候为它服务过的面食。
- 他等待Bob和Jane完成。
- 他吃他的晚餐。
Servy利用多个线程(工作人员),他们每个人都同步工作,但彼此异步工作以实现并行性。
当然,这一切变得更有趣,如果我们考虑,例如,我们的炉子是否有两个燃烧器或只是一个。如果我们的炉子有两个燃烧器,那么我们的两个线程Bob和Jane都能够完成他们的工作,而不会相互影响。他们可能会碰到肩膀位,或每个尝试时不时抢在同一个机柜的东西,所以他们会每放慢一个位,但数量不多。如果他们每个人都需要共用一台炉灶,那么只要对方正在工作,他们实际上也不会完成任何工作。在这种情况下,工作实际上不会比只让一个人完全同步做饭更快,就像鲍勃自己做饭时一样。在这种情况下,我们用多线程烹饪,,但我们的烹饪不是并行化的。 并非所有的多线程工作实际上是并行工作。这是当你在一台CPU上运行多个线程时发生的情况。你并没有比使用一个线程更快地完成工作,因为每个线程只是轮流工作。 (这并不意味着多线程程序在一个内核CPU上毫无意义,它们不是,只是使用它们的原因不是为了提高速度。)
我们甚至可以考虑如何将这些厨师将使用任务并行库,看TPL什么用做他们的工作对应于每种类型的厨师的:
所以首先我们有鲍勃· ,只是写正常的非TPL代码,并同步做的一切:
public class Bob : ICook
{
public IMeal Cook()
{
Pasta pasta = PastaCookingOperations.MakePasta();
Sauce sauce = PastaCookingOperations.MakeSauce();
return PastaCookingOperations.Combine(pasta, sauce);
}
}
然后我们再简,谁启动两个不同的异步操作,从他们每个人的计算结果她之后等待他们两个。
public class Jane : ICook
{
public IMeal Cook()
{
Task<Pasta> pastaTask = PastaCookingOperations.MakePastaAsync();
Task<Sauce> sauceTask = PastaCookingOperations.MakeSauceAsync();
return PastaCookingOperations.Combine(pastaTask.Result, sauceTask.Result);
}
}
这里作为提醒,简正在使用TPL,和她做了很多工作,在并行,但她只用单线程做她的工作。
然后我们有Servy,他使用Task.Run
来创建一个任务,表示在另一个线程中工作。他启动了两个不同的工作人员,他们各自同时做一些工作,然后等待两个工人完成。
public class Servy : ICook
{
public IMeal Cook()
{
var bobsWork = Task.Run(() => PastaCookingOperations.MakePasta());
var janesWork = Task.Run(() => PastaCookingOperations.MakeSauce());
return PastaCookingOperations.Combine(bobsWork.Result, janesWork.Result);
}
}
只是'真棒'。伟大的比喻。谢谢:) –
+1 Servy的晚餐很好吃,让我们来看看[Eric Lippert的早餐](http://msdn.microsoft.com/en-us/magazine/hh456401.aspx):) –
写得很好!燃烧器的比喻很棒。 –