ASP.NET MVC的异步编程

ASP.NET MVC的异步编程

    在上篇《ASP.NET中的异步编程》http://blog.csdn.net/zztfj/article/details/6837985的文章中,我们已经体会到异步编程给网站带来的高性能,高扩展性。现在ASP.NET已经发展到了MVC 3了,那么在MVC中该如何进行异步编程呢?放心,.NET FrameWork已经给我们提供了AsyncController(异步控制器),用它可以实现MVC的异步编程。下面关于它的使用作个简单介绍。

    要使用AsyncController进行异步编程需要以下步骤。

1、  不要从 Controller 派生控制器,而应从AsyncController 派生。

2、  为Action创建两个方法。这两个方法分别以Async和Completed结尾。***Async方法返回void,***Completed方法返回ActionResult实例。尽管操作由两个方法组成,但使用与同步操作方法相同的 URL 来访问它(例如Portal/News?city=Seattle)。 其他方法(例如 RedirectToAction 和 RenderAction)还是将按照 News 而不是 NewsAsync 来引用操作方法。传递到 ***sAsync 的参数使用普通的参数绑定机制。传递到 ***Completed 的参数使用 Parameters 字典。

 

使用AsyncController的注意点:

1、使用OutstandingOperations 属性通知 ASP.NET 有多少个操作已挂起。 这是必要的,因为 ASP.NET 不能确定由操作方法启动了多少个操作或这些操作何时完成。当OutstandingOperations 属性为零时,ASP.NET 可通过调用 ***Completed 方法来完成整个异步操作。

2、如果要将特性应用于异步操作方法,则将它们应用于 ActionAsync 方法,而不是应用于ActionCompleted 方法。 忽略 ActionCompleted 方法上的特性。

已添加两个新的特性:AsyncTimeoutAttribute 和 NoAsyncTimeoutAttribute。 这些特性可让您控制异步超时时间。

3、如果异步操作方法调用一个使用 BeginMethod/EndMethod 模式公开方法的服务,则回调方法(即作为异步回调参数传递到 Begin 方法的方法)可能会在一个不由 ASP.NET 控制的线程上执行。 在此情况下,HttpContext.Current将为 null,并且当应用程序访问 AsyncManager 类的成员(例如 Parameters)时可能会出现争用条件。 若要确保已访问HttpContext.Current 实例并避免争用条件,则可以通过从回调方法中调用 Sync() 来还原 HttpContext.Current。

 

示例一:在一个方法中调用三个基于事件的异步WebService的示例

        private readonly ServiceClient _client = new ServiceClient();

        public void AsynchronousAsync() {
            ViewData["Title"] = "Parallel asynchronous calls";
            AsyncManager.OutstandingOperations.Increment(3);

            string city = "Seattle";

            _client.GetHeadlinesCompleted += (sender, e) => {
                AsyncManager.Parameters["headlines"] = e.Result;
                AsyncManager.OutstandingOperations.Decrement();
            };
            
            _client.GetHeadlinesAsync(city);

            _client.GetScoresCompleted += (sender, e) => {
                AsyncManager.Parameters["scores"] = e.Result;
                AsyncManager.OutstandingOperations.Decrement();
            };
            _client.GetScoresAsync(city);

            _client.GetForecastCompleted += (sender, e) => {
                AsyncManager.Parameters["forecast"] = e.Result;
                AsyncManager.OutstandingOperations.Decrement();
            };
            _client.GetForecastAsync(city);
        }

        public ActionResult AsynchronousCompleted(NewsHeadline[] headlines, SportsScore[] scores, WeatherForecast[] forecast) {
            return View("Common", new ViewModel {
                Headlines = headlines,
                Scores = scores,
                Forecast = forecast
            });
        }


完整的下载地址:http://archive.msdn.microsoft.com/aspnetmvcsamples/Release/ProjectReleases.aspx?ReleaseId=3547

示例二:调用一个Begin/End模式的异步WebService的示例

        public void NewsAsync(string city)
        {
            AsyncManager.OutstandingOperations.Increment();
            _client.BeginGetHeadlines(city, ar =>
            {
                if (ar.CompletedSynchronously)
                {
                    AsyncManager.Parameters["news"] =
                        _client.EndGetHeadlines(ar);
                    AsyncManager.OutstandingOperations.Decrement();
                }
                else
                {
                    AsyncManager.Sync(() =>
                    {
                        AsyncManager.Parameters["news"] =
                        _client.EndGetHeadlines(ar);
                        AsyncManager.OutstandingOperations.Decrement();
                    });
                }
            }, null);
        }
        public ActionResult NewsCompleted(NewsHeadline[] headlines)
        {
            return View("Common", new ViewModel
            {
                Headlines = headlines
            });
        }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作者简介 Jess Chadwick 专注于Web技术领域,独立软件技术顾问。超过10年的软件开发经验,就职的公司包括嵌入式设备创业公司、世界500强。ASPInsider、微软ASP.NET 领域的MVP。经常在新泽西的NJDOTNET做技术讲座。 Todd Snyder超过18年软件开发经验。微软平台的企业级系统架构提供技术咨询和开发指导。就职于美国 Infragistics公司,经常作为讲师受邀参加各种技术会议。 Hrusikesh Panda:架构师、RIA专家、Web架构师以及开源爱好者。 目录 第1章:ASP.NET MVC基础 第2章:ASP.NET Web Form开发人员必读 第3章:使用数据 第4章:客户端开发 第5章:Web应用程序架构 第6章:使用AJAX提升网站体验 第7章:ASP.NET Web API 第8章:高级数据 第9章:安全 第10章:移动Web网站开发 第11章:并行计算、异步和实时数据操作 第12章:缓存 第13章:客户端优化技术 第14章:高级路由 第15章:可复用UI组件 第16章:日志 第17章:自动测试 第18章:自动化生成 第19章:部署 附录A ASP.NET MVC与Web Form集成 附录B 作为平台使用NuGet 附录C ASP.NET MVC开发最佳实践原则 附录D 交叉引用:目标主题、特性和场景 索引 内容简介 本书介绍了微软最新的ASP.NET MVC 4框架,包括如何使用ASP.NET MVC 4框架构建Web应用程序,ASP.NET MVC 4框架的运行原理,如何在真实开发场景中使用ASP.NET MVC 4框架新特性来解决不同的需求,如何使用HTML、JavaScript、Entity Framework以及其他Web相关的技术。同时,分享了许多实际项目开发的最佳实践经验,包括如何使用jQery、jQuery、Entity Framework、ASP.NET Web API进行应用程序开发。而且还深入阐述了许多高级知识点,如网站SEO、性能优化、日志、缓存等。 对于想要学习ASP.NET MVC Web编程的开发人员来说,本书无疑是最佳选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值