2015-01-11 3 views
-4

Я знаю, что Async и потоки - две разные вещи, поскольку первая предназначена для разработки асинхронных действий, а другая для синхронных или параллельных функций. Но одна вещь, которую я только что заметил, заключается в том, что когда цель заключается в том, чтобы приложение реагировало и живое во время длительных задач, при использовании Async и Await значительно меньше использования ЦП, которые делают старый путь с потоком, подобным этому:Производительность: Async vs Thread

Thread Task1 = new Thread(()=>{ 

     // Do Something 
}); 

Thread Task2 = new Thread(()=>{ 
     Task1.Start(); 
     while(true){ 
     if (!Task1.IsAlive){ 
      // Do something 
      break; 
     } 
     Thread.Sleep(50); 
     } 
}); 

Я просто хочу знать, нормально ли видеть, что Async имеет более высокую производительность, потому что я думаю, что тот же senario работает в фоновом режиме для задач Async. Используя ту же миллисекунду задержки (50) для обоего:

Thread.Sleep(50) -> thread 
await Task.Delay(50) -> Async 

на тестовой производительность приложения я наблюдал примерно менее 5% загрузки процессора на Async для выполнения той же операции.

+2

Вы сравниваете апельсины с яблоками. Вы должны уточнить свой вопрос, поскольку ваш пример кода выполняет две разные вещи. –

+0

@YuvalItzchakov: оба кода не запускают две задачи Асинхронно, посмотрите на них еще раз. Нить ждет завершения задачи, прежде чем запускать что-то еще. То же самое делается в Async, как он ожидает. Но Async потребляет меньше CPU. – Ricky

+4

'Thread.Sleep' и' Task.Delay' не делают то же самое. –

ответ

0

От «чтобы приложение реагировало» Я пришел к выводу, что вы говорите о какой-то программе Windows.

В этом случае async/await будет запускать в той же теме пользовательского интерфейса, что и остальная часть программы. Диспетчер окон выполнит асинхронную часть вместе с остальными последовательно. (Продолжение кода после операции асинхронного сам по себе будет работать в потоке пользовательского интерфейса)

С другой стороны, фоновый рабочий (нить) будет работать параллельно и, возможно, на другое ядро ​​(в настоящее время).

В любом случае, использование ЦП сообщает вам ничего о том, что происходит.

+3

«Диспетчер окон выполнит асинхронную часть вместе с остальными последовательно» - это неверно. Асинхронные операции, по определению, не используют текущий поток. Кроме того, некоторые даже не используют нить; они просто используют существующие механизмы ОС, чтобы позволить операции выполнять независимые от любого работающего потока в процессе. Кажется, вы запутываете сама асинхронную операцию с механизмом продолжения (т. Е. Что происходит после завершения инструкции 'await'), где продолжение по умолчанию выполняется в потоке пользовательского интерфейса. –

+0

Я улучшил свой ответ – DrKoch