gpt4 book ai didi

c# - Asp MVC 和 Web Api 异步 Controller

转载 作者:行者123 更新时间:2023-11-30 12:30:21 26 4
gpt4 key购买 nike

我当时使用的是 Asp MVC 3,在我的应用程序中创建了异步 Controller ,方法如下:

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 中那样创建具有异步操作的 Controller 。目前它看起来像:

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);
}

这个完整的 Action 会在后台线程中工作吗?以及如何制作我的 GetSomeResult()等待功能?返回Task<HttpResponseMessage>不可等待。

最佳答案

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

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

关于c# - Asp MVC 和 Web Api 异步 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16273796/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com