任務可以用於表示發生在多個線程上的操作,但它們不具有具有。一個可以編寫只在單個線程中執行的複雜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):) –
寫得很好!燃燒器的比喻很棒。 –