asp.net MVC和Web Api异步控制器



我正在使用Asp MVC 3,并在我的应用程序中创建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像这样或有一些更好的方式是存在的?

乌利希期刊指南。同样,如果我使用

public async Task<HttpResponseMessage> ActionAsync()
{
   var result = await GetSomeResult();
   return Request.CreateResponse(HttpStatusCode.Created, result);
}

这个完整的动作会在后台线程中工作吗?如何使GetSomeResult()函数是可等待的?返回Task<HttpResponseMessage>不是可等待的

有一个很大的不同,在MVC 3中,你基本上是在ActionAsync方法被调用后释放客户端(客户端线程被释放,它必须调用ActionCompleted动作之后获得结果)。如果这就是您正在寻找的,则需要在客户端实现带有任务的异步代码。

你的第二个版本是使服务器代码异步,但客户端线程仍将同步等待响应。await GetResult将使服务器线程返回到ASP。. NET线程池,直到GetResult方法返回一些东西,以便线程可以被另一个请求重用。这与背景工作没有任何关系。如果您想使用即发即忘的方法,您需要使用Task.Factory.StartNew(() =>您的代码)或ThreadPool.QueueUserWorkItem(() =>您的代码)

最新更新