Asp MVC和Web Api异步控制器

时间:2013-04-29 07:58:41

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-web-api

我正在使用Asp MVC 3,并且在我的应用程序中使用以下方法创建了异步控制器:

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。另外,如果我将使用

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

这个完整的动作会在后台线程中运行吗?以及如何让我的GetSomeResult()功能等待?这是Task<HttpResponseMessage>无法等待的回报。

1 个答案:

答案 0 :(得分:2)

与MVC 3中的原始操作有很大不同,您在调用ActionAsync方法后基本上释放客户端(客户端线程已释放,之后必须调用ActionCompleted操作才能获得结果)。如果这就是您要查找的内容,则需要在客户端实现具有任务的异步代码。

您的第二个版本是使服务器代码异步,但客户端线程仍将等待同步响应。 await GetResult将使服务器线程返回到ASP.NET线程池,直到GetResult方法返回一些内容,以便该线程可以与另一个请求一起重用。它与后台工作没有任何关系。如果你想使用fire and forget方法,你需要使用Task.Factory.StartNew(()=&gt;你的代码)或ThreadPool.QueueUserWorkItem(()=&gt;你的代码)