Извикване на await на task, който е създаден с Task.Run()

+5 гласа
37 прегледа
попитан 2016 юни 16 в .NET от Nikoleta.V. (4,090 точки)

Това защо е възможно да се направи в C#? 

var task = Task.Run (...); 

await task; 

Не се ли предполага, че Task.Run() се ползва за код, обвързан с процесора? Има ли смисъл да се извиква await за това? 

Разбирам, че след извикване на Task.Run, task-а върви в друга нишка от thread pool-а. Какъв е смисълът да се извиква await? Не е ли по-логично да се ползва task.Wait() ? 

Първото ми впечатление беше, че await се ползва само с async методи. Често ли се ползва с task-ове, върнати от Task.Run() ? 

Защо има Task.Wait () а не Task.Await()? Защо има метод Wait() и ключова дума await. Не е ли по-консистентно да се ползва метода и в двата случая? 

1 отговор

0 гласа
отговорени 2016 юни 16 от valeri.hristov (7,340 точки)
избран 2016 юни 17 от Nikoleta.V.
 
Най-добър отговор
Няма смисъл изобщо да се ползва Wait. Няма смисъл да се пуска нова нишка за определена задача, ако ще има друга нишка, която не прави нищо и я чака. Единствената смислена възможност от двете е await. Await-ването на задача е смислено, тъй като позволява на оригиналната нишка да продължи изпълнението си.

Смислено е да се ползва await за всеки тип Task(в правилния контекст), независимо от къде идва. Няма нищо специално в изчакването на асинхронни методи. Всъщност, всяка асинхронна програма се нуждае от асинхронни методи, които не използват async. Ако всяко await изчаква async метод, то тогава няма да имаш откъде да започнеш.
коментиран 2016 юни 17 от Nikoleta.V. (4,090 точки)
Благодаря за отговора, всичко е точно
...