asp.net MVC和Web Api异步控制器
本文关键字:异步 异步控制 控制器 Api Web net MVC asp | 更新日期: 2023-09-27 18:11:13
我正在使用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(() =>您的代码)