2016-06-19 2 views
3

Я смущен о C# async. Я понимаю async для параллельной обработки задачи. Например, метод выполняет задачи A и B, а async позволяет A и B выполнять действие в одно и то же время; B не нужно ждать, пока A не будет сделано.ASP.NET и C# async

Но приведенный ниже примерный код выполняет только одну задачу, которая извлекает данные из базы данных. Это означает, что для параллельных задач нет ничего. Но почему он использует async?

Просьба дать мне совет, чтобы я мог понять async.

[ResponseType(typeof(BookDetailDTO))] 
public async Task<IHttpActionResult> GetBook(int id) 
{ 
    var book = await db.Books.Include(b => b.Author).Select(b => 
     new BookDetailDTO() 
     { 
      Id = b.Id, 
      Title = b.Title, 
      Year = b.Year, 
      Price = b.Price, 
      AuthorName = b.Author.Name, 
      Genre = b.Genre 
     }).SingleOrDefaultAsync(b => b.Id == id); 
    if (book == null) 
    { 
     return NotFound(); 
    } 

    return Ok(book); 
} 
+1

https://msdn.microsoft.com/en-us/library/mt674882.aspx – Crowcoder

+0

Это лучшая статья/пояснения, особенно раздел «Темы» - это разъясняет, что вы неправильно поняли. –

+1

Только для записи «async позволяет A и B делать действие в одно и то же время»; не является правильным. В большинстве случаев это не * в то же время *. Лучше всего подумать об этом, так как «async/awaits - это синтаксический сахар, который позволяет сделать программу A, пока она ждет результатов B без написания сложного кода». – mayu

ответ

7

Я подробно объясняю это в своих async ASP.NET article. Таким образом, async работает, освобождая потоки, поэтому эти потоки могут использоваться для других целей.

означает, что для параллельных задач нет ничего. Но почему он использует async?

Это правда, что этот запрос не делать несколько вещей одновременно; что делает его асинхронным, не ускоряет запрос вообще.

Однако в заявке в целом есть другие дела; в частности, он имеет другие запросы, на которые он может ответить. Использование async освобождает потоки пула потоков, когда они не активно используются. Это позволяет масштабировать приложение (при условии, что ваш бэкэнд является масштабируемым). Другими словами, async позволяет максимально использовать пул потоков.

0

Он использует Асинхронный, потому что подключение к базе данных и получения ответа может занять некоторое время, и если это было сделано синхронно приложение будет заперта в состоянии ожидания все это время.

При выполнении асинхронного вызова приложение может выполнять что-то еще, пока запрос отправляется в базу данных и возвращенные данные.

-2

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

Таким образом, весь ваш пользовательский интерфейс не замерзает, когда вы извлекаете данные из своей базы данных.

+4

Этот ответ был бы совершенно правильным, если это было клиентское приложение. Однако для ASP.NET этот ответ неверен; 'async' не вызывает отправку HTTP-ответа. –

+2

Кроме того, нить не подвешена. – Crowcoder

+1

@ StephenCleary о, вы правы; Я полностью пропустил тег ASP.NET. Таким образом, мой ответ не совсем подходит ... – Luca

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