2013-11-10 3 views
0
public **HttpResponseMessage** GetContacts() 
{ 
    var result = db.Contacts().ToList(); 
    return this.Request.CreateResponse(HttpStatusCode.BadRequest, result); 
} 

, чтобы сделать этот вызов ASYNC, это достаточно, чтобы добавить «асинхронный Task <>» для возврата вызова:Создания Асинхронного моего существующего API

public **async Task<HttpResponseMessage>** GetContacts() 
{ 
    var result = db.Contacts().ToList(); 
    return this.Request.CreateResponse(HttpStatusCode.BadRequest, result); 
} 

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

public **async Task<HttpResponseMessage>** GetContacts() 
{ 
    var result = **await** db.Contacts().ToList(); 
    return this.Request.CreateResponse(HttpStatusCode.BadRequest, result); 
} 
+1

Укажите, в чем вопрос/проблема/цель. Что вы пробовали до сих пор? – Markus

+2

Похоже, вы на самом деле не понимаете, как работает 'async'-'await'. Вы пытались взглянуть на введение? – svick

+0

@both ... прежде чем я разместил это, я пробовал как минимум 4-5 вариантов, которые я нашел в Интернете. Должен ли я опубликовать все, что я пробовал до сих пор, связанный со многими часами исследований, прежде чем приходить в Stack ... на вопрос? – Johnny

ответ

3

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

Так, с началом кода, как

public HttpResponseMessage GetContacts() 
{ 
    var result = db.Contacts().ToList(); 
    return this.Request.CreateResponse(HttpStatusCode.BadRequest, result); 
} 

Первое, что нужно изменить это ToList, которая становится ToListAsync и ждут:

public HttpResponseMessage GetContacts() 
{ 
    var result = await db.Contacts().ToListAsync(); 
    return this.Request.CreateResponse(HttpStatusCode.BadRequest, result); 
} 

Тогда, потому что вы используете await, ваш метод должен быть помечен как async:

public async Task<HttpResponseMessage> GetContactsAsync() 
{ 
    var result = await db.Contacts().ToListAsync(); 
    return this.Request.CreateResponse(HttpStatusCode.BadRequest, result); 
} 

Вы можете найти мой async intro полезный.

+0

Любите свой путь, чтобы объяснить вещи. Быстрый вопрос: какой лучший способ «узнать», какой метод больше блокирует, чем другие? – Johnny

+1

Это метод, который заставляет поток вводить состояние ожидания для нетривиального количества времени. Я не уверен в том, что вы можете «обнаружить» их (без срабатывания ложных срабатываний, таких как синхронизация потоков). Как правило, большинство естественно-асинхронных методов используют I/O, поэтому связь с БД, веб-запросы, дисковый ввод-вывод и т. Д. К тому времени, когда вы сделаете все свои асинхронные операции ввода-вывода, вы удалите большую часть или все ваши блокировка. –

+0

Стивен по сценарию с вызовами API, которые в настоящее время занимают обычно 0,3 секунды, могли бы вы по-прежнему считать их «асинхронными», если у них есть взаимодействие с базой данных? BTW, любите свое асинхронное вступление !! – Johnny

2

Как вы говорите, для того, чтобы сделать его асинхронным вы должны убедиться, что у вас есть asynchornous вызова внутри вашего метода, в противном случае не будет никакой разницы.

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

+0

Вы имели в виду пример №2 в моем первоначальном вопросе или # 2 ответа? Также есть ли разница между # 2 и № 3 с точки зрения производительности или исполнения? – Johnny

+1

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

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