基于异步的MVC webAPI控制器
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控制器的更多相关文章
- SlickOne -- 基于Dapper, Mvc和WebAPI 的快速开发框架
前言:在两年前,项目组推出了基于Dapper,Mvc和WebApi的快速开发框架,随着后续Slickflow产品的实践和应用,今再次对SlickOne项目做以回顾和总结.其目的是精简,持续改进,保持重 ...
- SlickOne敏捷开发框架介绍(一) -- 基于Dapper, Mvc和WebAPI 的快速开发框架
前言:在两年前(最初发布时间:2013年1月9日(csdn),当前文章时间2015年11月10日),项目组推出了基于Dapper,Mvc和WebApi的快速开发框架,随着后续Slickflow产品的实 ...
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
C#编译器优化那点事 使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的.优化代码 ...
- Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World。
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
- Taurus.MVC WebAPI 入门开发教程4:控制器方法及参数定义、获取及基础校验属性【Require】。
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
- Taurus.MVC WebAPI 入门开发教程5:控制器安全校验属性【HttpGet、HttpPost】【Ack】【Token】【MicroService】。
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
- Taurus.MVC WebAPI 入门开发教程6:全局控制器DefaultController与全局事件。
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
- MVC WebApi 用户验证 (2)
构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(66)-MVC WebApi 用户验证 (2) 前言: 构建ASP.NET MVC5+EF6+E ...
- 构建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简单的登录并 ...
随机推荐
- Android SDK下载和更新失败的解决方法!!!
Failed to fetch URL http://dl-ssl.google.com/android/repository/addons_list-1.xml. 据说dl-ssl.google.c ...
- VS2013单元测试
原文地址:http://www.luacloud.com/2014/vs2013-unit-test-generator.html 下载地址:http://visualstudiogallery.ms ...
- HDU_2026——将单词的首字母变大写
Problem Description 输入一个英文句子,将每个单词的第一个字母改成大写字母. Input 输入数据包含多个测试实例,每个测试实例是一个长度不超过100的英文句子,占一行. O ...
- windows内核对象句柄
内核对象用于管理进程.线程和文件等诸多种类的大量资源,每一个内核对象都只是一个句内存快,它由操作系统内核分配,并只能右操作系统内核访问.这个内存块是一个数据结构,其维护着与对象相关的信息,其中少数成员 ...
- HDU5196--DZY Loves Inversions 树状数组 逆序数
题意查询给定[L, R]区间内 逆序对数 ==k的子区间的个数. 我们只需要求出 子区间小于等于k的个数和小于等于k-1的个数,然后相减就得出答案了. 对于i(1≤i≤n),我们计算ri表示[i,ri ...
- mysql中文名字按首字母排序
在mysql数据库中可以使用GBK编码对中文进行排序,如名字按首字母排序 order by convert(substr(tu.username,1,1) using 'GBK') 其中substr方 ...
- 3D空间包围球(Bounding Sphere)的求法
引言 在3D碰撞检測中,为了加快碰撞检測的效率,降低不必要的碰撞检測,会使用基本几何体作为物体的包围体(Bounding Volume, BV)进行測试.基本包围体的碰撞检測相对来说廉价也easy的多 ...
- EA+svn实现UML的版本号控制
一.安装软件 1.VisualSvn Server svnserver 2.Tortoise Svn svnclient 3.Slik-Subversion-1.7.8-x64版本号控制插件 4.En ...
- Java 动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...
- Sybase常用函数
==================================常用函数===========================================字符串函数1)ISNULL(EXP1, ...