ASP.NET MVC4中的异步控制器

在抛弃了对.NET 3的支持之后, ASP.NET MVC 4 彻底拥抱了Task类库, 你不需要再蛋疼的给每个Action写两个方法, 也无需傻傻的手动对异步Action计数器增减了(AsyncManager.OutstandingOperations.Increment()), 现在的你只需拿起手指, 轻轻敲几下, 其他的事情都由系统帮你完成 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class PortalController : AsyncController
{
     public Task<ViewResult> News( string city)    
     {
           return Task.Factory.StartNew(() =>  RunThread(city))
                .ContinueWith(t =>
                               {
                                       return View(new ViewStringModel()
                                                   {
                                                       Text = t.Result
                                                   });
                               });
     }
 
      private string  RunThread(string input)
      {
            Thread.Sleep(5000);
            return input;
      }
 }

 是不是好多了?Lamda可以让一切更爽

1
2
3
4
public Task<ViewResult> News(string city) {
     return Task.Factory.StartNew(() => RunThread(city))
         .ContinueWith(t => View(new  ViewStringModel{ Text = t.Result }));
 }

那么, 是不是到这里就要说再见了呢? 不是的, 请继续往下看

伟大的async/await

虽然还未到正式发布的时候, 不过如果我们跟着微软的目光往前更进一步, 在ASP.NET和C# 5中, 或者我们从这里可以给.NET 4增加Async 的功能, 在有了async和await这两个关键词之后, 异步编码就更简单啦, 这其中也包括异步控制器的相关操作: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class PortalController : AsyncController {
     public async Task<ViewResult> News(string city)
     {
            return View(new  ViewStringModel()
                         {                            
                                  Text = await NewThread(city)
                         });
     }     
 
     private async Task<string> NewThread(string input)   
     {        
            Thread.Sleep(5000);        
            return input;
     }
 }

 总结

由于有了async和await关键字以及Task类库的帮助, 在可预见的未来里, 我们操作异步控制器就可以像操作普通的控制器一样了, 但就像其他的众多新增的.NET特性一样, 能力越大, 责任也就越大, 方便也往往意味着滥用. 异步控制器固然好, 但也并非每种场合都适合用它, 不恰当的使用它往往会导致服务器需要在不同的线程之间切换, 而这也带来了更多额外的开销. 在开发领域, 我们尤其要注意性能往往比其他任何东西都重要, 因此, 请在确实能提高性能和用户相应的情况下使用异步控制器

posted @   以德为先  阅读(965)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示