我们有一系列ASP.NET MVC控制器,它们都继承自单个基本控制器(继承自Controller类)。我们现在正在考虑创建一些异步操作,并且想知道如果我们只是将基本控制器更改为继承AsyncController而不是Controller(意味着我们所有的控制器都将继承自AsyncController),我们是否会遇到任何麻烦。
答案 0 :(得分:6)
杰斯,
在我看来,你不会受到伤害,因为当你遵循以下约定时,asynch功能才会被调用:
public class PortalController : AsyncController
{
public void NewsAsync(string city)
{
AsyncManager.OutstandingOperations.Increment();
NewsService newsService = new NewsService();
newsService.GetHeadlinesCompleted += (sender, e) =>
{
AsyncManager.Parameters["headlines"] = e.Value;
AsyncManager.OutstandingOperations.Decrement();
};
newsService.GetHeadlinesAsync(city);
}
public ActionResult NewsCompleted(string[] headlines)
{
return View("News", new ViewStringModel
{
NewsHeadlines = headlines
});
}
}
该约定是在命名中添加了News * Async *和News * Completed *部分。
请参阅:
async controllers in asp.net mvc 2
观察控制器类现在派生自AsyncController而不是Controller。此外,新闻动作方法已被拆分为名为NewsAsync和NewsCompleted的方法,这些方法与异步页面中的Begin和End方法类似。逻辑上,控制器仍然公开名为News的单个操作方法。但在物理上,方法实现已经使用整个.NET框架中使用的异步模式的变体进行了分解。
如果您没有更改继承的控制器代码中的任何内容,则不会启动异步激活。然而,正如罗伯特上面所说的那样(或者可能是:-)),你可以根据需要来装饰行动,以保持意图清晰,但是,我个人认为会议应该清楚地表明这一点。
当然值得辩论。答案 1 :(得分:2)
MVC 4没有异步控制器 - 请参阅来源:
namespace System.Web.Mvc
{
// Controller now supports asynchronous operations.
// This class only exists
// a) for backwards compat for callers that derive from it,
// b) ActionMethodSelector can detect it to bind to ActionAsync/ActionCompleted patterns.
public abstract class AsyncController : Controller
{
}
}
答案 2 :(得分:1)
你应该没问题,因为AsyncController
已经从Controller
继承。
该页面上的评论对于确定您是否通过继承AsyncController
做正确的事情非常有用,并提供了一个很好的指南,让您保持正确的轨道。
答案 3 :(得分:1)
如果在Action方法中设置断点并观察callstack(启用Show External code),您将看到调用驻留在AsyncController和标准Controller中的同步操作需要几个额外的步骤。即AsyncControllerActionInvoker调用以BeginInvokeSynchronousActionMethod结尾的Begin / End样式方法。我不知道这些额外调用会产生多少开销,但是在你从AsyncController盲目扩展所有控制器之前,即使没有异步操作,也要注意这一点。
答案 4 :(得分:0)
Async Controller的使用取决于您是否要在继续执行下一个任务之前等待任何特定任务或步骤完成。问题类似于在您的薪水支付金额到达您的支票账户之前从亚马逊购买东西。
对于典型的Web应用程序,我认为这是不可取的。 Web服务器已经非常平行,因此唯一的优势是加快对用户的响应速度。对于许多操作而言,这种好处可以忽略不计。
我会在后台为长时间运行的进程保留异步控制器,在将网页返回给用户控件之前等待任务完成是不切实际的。
注意:如果您有.NET反汇编程序(或ASP.NET MVC source)的副本,则可以打开AsyncController类并查看代码。这应该会让您很好地了解是否可以将AsyncController
用作普通Controller
。
我在下面链接的文章说:“从AsyncController派生的控制器使ASP.NET能够处理异步请求,他们仍然可以为同步操作方法提供服务。”