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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值