Я до сих пор не совсем понимаю, что такое асинхронность и ожидание в .net 4.5. Пока, кажется, я понимаю, что ждут:
- помещает функцию (справа) в отдельный поток.
- возвращает выполнение вызывающему объекту текущей функции
- но удерживает остальную часть кода текущей функции «заложником», пока ожидающая (асинхронная) функция не завершится.
Пожалуйста, поправьте меня, если я что-то неправильно понимаю. Итак, если вышесказанное верно, я застрял с функцией Post ApiController, которую я хочу асинхронно:
[HttpPost]
public async Task<HttpResponseMessage> Post([FromBody]MyObject obj)
{
myDataContext.MyObjects.InsertOnSubmit(obj);
myDataContext.SubmitChanges();
await SomeReallyLongRunningTaskAsync();
// obj would now have the new Id, which I'm really after.
return Request.CreateResponse(HttpStatusCode.Created, obj);
}
Итак, если я правильно понимаю, Post завершит выполнение и вернет управление тому, кто вызвал myApiController.Post(obj)
. Но у меня еще нет объекта HttpResponseMessage
, так как await держит return Request.CreateResponse(HttpStatusCode.Created, obj);
"заложником".
В приведенном выше простом примере будет ли вызов немедленно возвращаться к клиенту (то есть к клиентскому веб-сайту JS или мобильному приложению)? Если да, то это будут 201, 400, 500 (лучше не надо), другие?