MVC – Task-based Asynchronous Pattern (TAP) – Async Controller and SessionLess Controller

In async programming, there are 3 different models for different scenarios :

  • Asynchronous Programming Model – APM
  • Task Based Asynchronous Programming Model – TAPM
  • Evented Asynchronous Programming Model – EAPM

We can use all models in .net framework. It provides related libraries in their own namespaces. The Task-based Asynchronous Pattern (TAP) is based on System.Threading.Tasks.Task and System.Threading.Tasks.Task<TResult> types in the System.Threading.Tasks namespaces.

When we’re developing web application, if we need to develop async applications on web side, we can use this libraries to reflect async behavior. For Instance, if we want to communicate external services or channels at the same time, we might use async controller to avoid operation blocks. When we’re reflecting this behavior in an application, We should think tasks in action level. I mean, surely according to our scenario, if we seperate all actions as different tasks, it can be more useful and manageble.

In .Net Framework MVC Applications, We can use Async Controllers and async actions. For instance please check code below :

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public class HomeController : AsyncController
    {
        public NorthwindEntities NorthwindContext { get; set; }
        public HomeController()
        {
            NorthwindContext = new NorthwindEntities();
        }
        public async Task<ActionResult> Index()
        {
            var indexViewModel = new IndexViewModel();
 
            Stopwatch stopwatch = new Stopwatch();
 
            stopwatch.Start();
            indexViewModel.Categories = await Categories();
            indexViewModel.Shippers = await Shippers();
            indexViewModel.Currencies = await Currencies();
            stopwatch.Stop();
 
            indexViewModel.TotalTime = stopwatch.Elapsed;
 
            return View(indexViewModel);
        }
 
        public async Task<List<SelectListItem>> Shippers()
        {
            var shippers = await NorthwindContext.Shippers.Select(x => new SelectListItem()
            {
                Text = x.CompanyName,
                Value = x.ShipperID.ToString()
            }).ToListAsync();
 
            return shippers;
        }
 
        public async Task<List<SelectListItem>> Categories()
        {
            var shippers = await NorthwindContext.Categories.Select(x => new SelectListItem()
            {
                Text = x.CategoryName,
                Value = x.CategoryID.ToString()
            }).ToListAsync();
 
            return shippers;
        }
 
        public async Task<string> Currencies()
        {
            WebClient client = new WebClient();
 
            var exchange = await client.DownloadStringTaskAsync("http://www.tcmb.gov.tr/kurlar/today.xml");
 
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(exchange);
 
            string USDSELL = xmlDoc.SelectSingleNode("Tarih_Date/Currency[@Kod='USD']/BanknoteSelling").InnerXml;
 
            string USDBUY = xmlDoc.SelectSingleNode("Tarih_Date/Currency[@Kod='USD']/BanknoteBuying").InnerXml;
 
            return $"USD Banknote Selling :{USDSELL} - Banknote Buying :{USDBUY}";
        }
    }
 
    public class IndexViewModel
    {
        public TimeSpan TotalTime { get; set; }
        public List<SelectListItem> Categories { get; set; }
        public List<SelectListItem> Shippers { get; set; }
        public string Currencies { get; set; }
    }

And also, if you need to run multiple requests concurrently, use SessionLess controller :

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
[SessionState(SessionStateBehavior.Disabled)]
    public class HomeController : Controller
    {
        public NorthwindEntities NorthwindContext { get; set; }
        public HomeController()
        {
            NorthwindContext = new NorthwindEntities();
        }
        public async Task<ActionResult> Index()
        {
            var indexViewModel = new IndexViewModel();
 
            Stopwatch stopwatch = new Stopwatch();
 
            stopwatch.Start();
            indexViewModel.Categories = await Categories();
            indexViewModel.Shippers = await Shippers();
            indexViewModel.Currencies = await Currencies();
            stopwatch.Stop();
 
            indexViewModel.TotalTime = stopwatch.Elapsed;
 
            return View(indexViewModel);
        }
 
        public async Task<List<SelectListItem>> Shippers()
        {
            var shippers = await NorthwindContext.Shippers.Select(x => new SelectListItem()
            {
                Text = x.CompanyName,
                Value = x.ShipperID.ToString()
            }).ToListAsync();
 
            return shippers;
        }
 
        public async Task<List<SelectListItem>> Categories()
        {
            var shippers = await NorthwindContext.Categories.Select(x => new SelectListItem()
            {
                Text = x.CategoryName,
                Value = x.CategoryID.ToString()
            }).ToListAsync();
 
            return shippers;
        }
 
        public async Task<string> Currencies()
        {
            WebClient client = new WebClient();
 
            var exchange = await client.DownloadStringTaskAsync("http://www.tcmb.gov.tr/kurlar/today.xml");
 
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(exchange);
 
            string USDSELL = xmlDoc.SelectSingleNode("Tarih_Date/Currency[@Kod='USD']/BanknoteSelling").InnerXml;
 
            string USDBUY = xmlDoc.SelectSingleNode("Tarih_Date/Currency[@Kod='USD']/BanknoteBuying").InnerXml;
 
            return $"USD Banknote Selling :{USDSELL} - Banknote Buying :{USDBUY}";
        }
    }
 
    public class IndexViewModel
    {
        public TimeSpan TotalTime { get; set; }
        public List<SelectListItem> Categories { get; set; }
        public List<SelectListItem> Shippers { get; set; }
        public string Currencies { get; set; }
    }

AST

This entry was posted in .Net Framework, ASP.Net, Design Patterns, MVC, Server Side Web Programming,Web Programming and tagged async, asynchronous operations, controller, mvc 5, sessionless, tap, task based asynchronous pattern on July 4, 2016.

基于异步的MVC webAPI控制器的更多相关文章

  1. SlickOne -- 基于Dapper, Mvc和WebAPI 的快速开发框架

    前言:在两年前,项目组推出了基于Dapper,Mvc和WebApi的快速开发框架,随着后续Slickflow产品的实践和应用,今再次对SlickOne项目做以回顾和总结.其目的是精简,持续改进,保持重 ...

  2. SlickOne敏捷开发框架介绍(一) -- 基于Dapper, Mvc和WebAPI 的快速开发框架

    前言:在两年前(最初发布时间:2013年1月9日(csdn),当前文章时间2015年11月10日),项目组推出了基于Dapper,Mvc和WebApi的快速开发框架,随着后续Slickflow产品的实 ...

  3. C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理

    C#编译器优化那点事   使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的.优化代码 ...

  4. Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World。

    系列目录 1.Taurus.MVC WebAPI  入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...

  5. Taurus.MVC WebAPI 入门开发教程4:控制器方法及参数定义、获取及基础校验属性【Require】。

    系列目录 1.Taurus.MVC WebAPI  入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...

  6. Taurus.MVC WebAPI 入门开发教程5:控制器安全校验属性【HttpGet、HttpPost】【Ack】【Token】【MicroService】。

    系列目录 1.Taurus.MVC WebAPI  入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...

  7. Taurus.MVC WebAPI 入门开发教程6:全局控制器DefaultController与全局事件。

    系列目录 1.Taurus.MVC WebAPI  入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...

  8. MVC WebApi 用户验证 (2)

    构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(66)-MVC WebApi 用户验证 (2)   前言: 构建ASP.NET MVC5+EF6+E ...

  9. 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(66)-MVC WebApi 用户验证 (2)

    前言: 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(65)-MVC WebApi 用户验证 (1) 回顾上一节,我们利用webapi简单的登录并 ...

随机推荐

  1. B树——思路、及C语言代码的实现

    0.序 本人现读本科大二,这学期学习数据结构,老师为我们的期末作业布置一道任选题,而我一直以来都有听说B树是一棵挺神奇的树,所以我选择了它,当然更重要的原因是因为B树的难度最高,我喜欢做有挑战性的工作 ...

  2. 电脑上已经安装mysql之后安装wamp,wamp中的mysql无法启动的解决办法

    Wampserver安装完成后无法启动MySQL这有可能是你之前安装过MysqL,因为wampserver内置MySQL.解决的方法就是配置环境变量. 找到我的电脑或计算机右键,打开属性,然后打开高级 ...

  3. Label 添加表情图片

    // 添加表情 NSTextAttachment *attch = [[NSTextAttachment alloc] init]; // 表情图片 attch.image = [UIImage im ...

  4. [Javascript] Array methods in depth - some

    some returns a boolean value after passing each item in the source array through the test function t ...

  5. i春秋30强挑战赛pwn解题过程

    80pts: 栈溢出,gdb调试发现发送29控制eip,nx:disabled,所以布置好shellcode后getshell from pwn import * #p=process('./tc1' ...

  6. vs开发常用快捷键

    Ctrl+K+D:快速对齐代码///按D的时候K快速弹起 如果出现语法错误则无法对齐Ctrl+Z:撤销Ctrl+S:保存Ctrl+J:快速弹出智能提示Shift+End.Shift+Home//快速选 ...

  7. Lambda 笔记

    lambda表达式,将会带来代码的灵活性,同时使我们的代码更具表现力. Dim doubleIt As Func(Of Integer, Integer) = _ Function(x As Inte ...

  8. 关于.net根目录路径的问题

    今天做了一个项目,用了url重写,但是在本地目录是localhost/BK/index.aspx,而其他目录也必须带bk,不带的话就找不到页面,(iis里正常) 应该主目录去掉bk,设置方法,右击网站 ...

  9. SQL存储过程笔记

    一.概述 存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它. 优点:   ...

  10. 获取GET/POST提交的数据,并处理中文问题

    1.获取input标签中的值,用request.getParameter("User")(User为input的name值) 2. 获取checkbox的值,由于是多选的,所以不能 ...