Каква е разликата между ключовите думи Thread, Task и async/await

+4 гласа
842 прегледа
попитан 2016 юни 3 от Nikoleta.V. (4,090 точки)

Опитвам се да понауча многонишковото програмиране в .NET и имам няколко въпроса.Знам че има нещо наречено ThreadPoolАко създам нова нишка с Thread класа, тази нишка от ThreadPool-а ли се взима или се създава нова? 

Относно библиотеката Task.В MSDN пише следното : “представлява асихнронна операция“, но създаването на нишка и ползването на асинхронни операции са различни неща, нали? Като ползвам Task създавам асинхронна операция или нова нишка? 

И кога трябва да ползвам async/await? Има ли разлика в горните 2 случая? 

2 отговори

+3 гласа
отговорени 2016 юни 5 от valeri.hristov (7,340 точки)
избран 2016 юни 6 от Nikoleta.V.
 
Най-добър отговор

Така, едно по едно:

Ако създам нова нишка с Thread класа, тази нишка от ThreadPool-а ли се взима или се създава нова?

ThreadPool прави точно каквото показва и името му, съхранява нишки. Когато използваш Thread класа, създаваш нов Thread(нишка), който няма общо с ThreadPool.

В MSDN пише следното : “представлява асихнронна операция“, но създаването на нишка и ползването на асинхронни операции са различни неща, нали?

Вярно е това. Правенето на асинхронна операция не значи създаване на нова нишка и работа с нея. Означава да работиш паралелно. Асинхронните операции не изискват допълнителни нишки, те са „природно“ асинхронни още на ниво операционна система.

Като ползвам Task създавам асинхронна операция или нова нишка?

Може да направиш и двете:

  1. Promise-style tasks- те вървят заедно с async-await операторите. Представляват асинхронни операции, които не изискват използване на нишки. Пример за това са Stream и HttpClient класовете. Повечето класове, които правят операции, обвързани с I/O, използват този тип Task
  2. Използване на Task.Run или Task.Factory.StartNew. Това ще вземе нишка от ThreadPool-а и ще изпълни подадения делегат, освен ако не му кажеш изрично да създаде нова нишка чрез TaskCreationOptions.LongRunning.

И кога трябва да ползвам async/await?

async/await вървят с всичко, което може да се изчаква(awaitable). Такъв клас е всеки, който има GetAwaiter метод, който връща тип, имплементиращ интерфейса INotifyCompletion или IcriticalNotifyCompletion. Можеш да разровиш повече тук:

msdn.microsoft.com/en-us/library/hh191443.aspx

+1 глас
отговорени 2016 юни 4 от iotbee.org (230 точки)
Ами трябва да се прочете малко повече. На долните линкове може да се намери отговор на въпросите:

1.

http://www.tutorialspoint.com/csharp/csharp_multithreading.htm

2.

https://www.youtube.com/watch?v=MCW_eJA2FeY
...