4

Я работал с Asp MVC 3, и в моем приложении был создан контроллер Async с некоторыми методами, как:Asp MVC и Web Api Async Контроллеры

public void ActionAsync() 
{ 
    AsyncManager.OutstandingOperations.Increment(); 
    AsyncManager.Parameters["someResult"] = GetSomeResult(); 
    AsyncManager.OutstandingOperations.Decrement(); 
} 

public JsonResult ActionCompleted(SometResultModel someResult) 
{ 
    return Json(someResult, JsonRequestBehavior.AllowGet); 
} 

И теперь, когда я работаю с MVC4 и Web Api мне нужно создать контроллер с асинхронными действиями, как в MVC 3. на текущий момент это выглядит следующим образом:

public Task<HttpResponseMessage> PostActionAsync() 
{ 
    return Task<HttpResponseMessage>.Factory.StartNew(() => 
      { 
       var result = GetSomeResult(); 
       return Request.CreateResponse(HttpStatusCode.Created, result); 
      }); 
} 

является ли это хорошая идея, чтобы сделать асинхронные действия в Web API, как это или есть какой-то лучший способ это существует?

UPD. Кроме того, если я буду использовать

будет ли это работать в фоновом режиме? И как сделать мою функцию GetSomeResult() ожидаемой? Это возвращение, что Task<HttpResponseMessage> не ждет.

ответ

2

Существует большая разница с вашим оригинальным действием в MVC 3, где вы в основном освобождаете клиента после вызова метода ActionAsync (клиентский поток освобождается, и он должен вызывать действие ActionCompleted после этого, чтобы получить результаты) , Если это то, что вы ищете, вам необходимо реализовать асинхронный код с задачами на стороне клиента.

Ваша вторая версия - сделать асинхронный код сервера, но клиентский поток по-прежнему будет ждать ответа синхронно. ожидание GetResult заставит поток сервера возвращаться в пул потоков ASP.NET до тех пор, пока метод GetResult не вернет что-то, чтобы поток можно было повторно использовать с другим запросом. Это не имеет ничего общего с фоновой работой. Если вы хотите использовать подход «огонь» и «забыть», вам нужно использовать Task.Factory.StartNew (() => ваш код) или ThreadPool.QueueUserWorkItem (() => ваш код)

+0

Можете ли вы показать мне, как это Действие должно выглядеть так? Я попытался использовать этот http://pastebin.com/NeRKfqDp. И все мои запросы «POST» возвращают «404» –

+0

Factory.StartNew окончательно ошибается в этом контексте, когда вы разворачиваете дополнительный поток (или планируете некоторые дополнительные работа в пуле потоков) в дополнение к потоку, обрабатывающему текущий запрос. Является ли EventModel.PrepareModel возвращением задачи? –

+0

'EventModel.PrepareModel' является функцией void. Итак, если «Factory.StartNew» ошибочно, что я должен использовать для создания асинхронного запроса? –

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