2014-09-12 4 views
3

Я смотрю на этих строках коды от другого разработчика:операция Асинхронной немедленно ждала

bool isValid = await engine.GetTaskByIdAsync(taskId); 
    if(isValid) 
    .... 

Когда я работаю с async операциями, она должна сделать самостоятельную работу, а операция асинхронной завершает:

Task<bool> task = engine.GetTaskByIdAsync(taskId); 

    //Do work that doesn't need the "task" variable 

    bool completed = await task; 
    if(bool) 
    .... 

Похоже, что первый пример запускает операцию async и сразу же начинает ждать. Есть ли какая-то ценность здесь, я не понимаю?

Примечание: этот код находится в уровне доступа к данным приложения, поэтому он не взаимодействует с пользовательским интерфейсом.

+0

Конечно, начинайте процесс и немедленно возвращайтесь, что это важно, если у вас есть логика заранее? –

+0

«Похоже, что первый пример запускает асинхронную операцию, а затем сразу же начинает ждать» - 'await' заставляет нас ждать завершения вызова перед продолжением. –

+0

Как бы вы сделали то, что сделал этот программист * без * ожидания задачи? – Servy

ответ

6

Есть ли какая-то ценность здесь, я не понимаю?

Абсолютно - это означает, что, хотя вам нужно значение, возвращаемое операцией, прежде чем вы сможете больше работать, вы не связываете нить, пока вы ее ждете. Это особенно важно, если вы пишете графический интерфейс, где привязка потока GUI в основном означает замораживание пользовательского интерфейса.

Похоже, вы сосредотачиваетесь на «параллельной» стороне асинхронности, что важно, но далеко не единственное преимущество.

+0

Хорошо, я работаю исключительно с сетью, поэтому я не об этом говорю. Этот код я нашел в слое доступа к данным, поэтому было любопытно, есть ли что-то, что можно почерпнуть из него. –

+1

@ChrisHardie Веб-приложение по-прежнему может выиграть от асинхронности. Он может разрешать веб-запросам не потреблять время потока потоков потоков, когда не выполняется работа с ЦП, позволяя этим потокам пулов потоков обслуживать другие запросы, позволяя серверу увеличивать количество возможных одновременных запросов, которые он может обслуживать. – Servy

+0

@Servy Разве вам не было бы лучше поднимать количество потоков, доступных на веб-сервере, в первую очередь? Добавление ожидания приводит к накладным расходам, но не волшебным образом увеличивает количество циклов процессора, доступных для системы. Хотя вы технически правы, я бы сказал, что вам лучше настроить веб-сервер правильно. – AVee

0

Общепринятая ошибка - это блоки ожидания. Это не так.

Текущий поток немедленно возвращается, а оставшаяся часть функции зарегистрирована для выполнения, когда асинхронная Завершение завершается.

Смежные вопросы