【问题标题】:Asp MVC and Web Api Async ControllersAsp MVC 和 Web Api 异步控制器
【发布时间】:2013-04-22 19:59:27
【问题描述】:

我正在使用 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&lt;HttpResponseMessage&gt; 不可等待。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 你能告诉我这个动作应该是什么样子吗?我试过使用这个pastebin.com/NeRKfqDp 我所有的“POST”查询都返回“404”
    • Factory.StartNew 在这种情况下肯定是错误的,因为除了当前处理当前请求的线程之外,您正在启动一个额外的线程(或在线程池中安排一些额外的工作)。 EventModel.PrepareModel 是否返回任务?
    • 'EventModel.PrepareModel' 是一个无效函数。那么,如果 'Factory.StartNew' 错误,我应该使用什么来发出异步请求?
    猜你喜欢
    • 2011-10-03
    • 1970-01-01
    • 2016-08-02
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多