Asp MVC异步控制器动作自动异步吗?

本文关键字:异步 控制器 MVC 异步控制 Asp | 更新日期: 2023-09-27 18:04:55

. NET MVC当你创建一个异步动作与它完成的动作它自动得到异步处理?

的例子:

如果我有一个长时间运行的任务没有声明一个委托异步void自动运行在后台线程?

   public void NewsAsync(string city) {
    AsyncManager.OutstandingOperations.Increment();
    NewsService newsService = new NewsService();
    AsyncManager.Parameters["headlines"] = newsService.GetHeadlines;
    AsyncManager.OutstandingOperations.Decrement();
}

或者只有当长时间运行的任务是异步任务时才这样做?

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

,换句话说,我不关心void内部的方法是否异步,但我关心的是,如果void它的自身是异步的,以便释放IIS线程

Asp MVC异步控制器动作自动异步吗?

您的第一个代码示例没有意义。NewsAsync必须尽可能快地返回,并将工作委托给某个后台线程。在第二个示例中,将结果传递给视图的是NewsCompleted操作。

至于那些后台线程,它将取决于这个NewsService.GetHeadlinesCompleted方法是如何实现的。对于异步控制器来说,最好的情况是有一些长时间运行的I/O操作(如web服务调用、数据库查询等),这些操作可以使用I/O完成端口来运行。在这种情况下,在请求执行期间没有线程被独占。在其他情况下,例如尝试异步执行同步操作(在我看来,您在第一个代码示例中正在尝试),异步控制器的好处非常值得怀疑,甚至可能使事情变得更糟。

为了更深入地理解ASP中的异步操作。. NET我向你推荐以下MSDN上的文章。它讨论了异步页面,但同样的概念也适用于ASP。. NET异步控制器在内部被实现为异步处理程序(使用IHttpAsyncHandler接口)。