基于异步的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简单的登录并 ...
随机推荐
- WP独立文件资源字典
有时候,开发者想把资源字典定义在单独的XAML文件中,在网上找了找,没找到比较详细的,自己弄了许久. 1. 新建xaml资源字典文件,如在根目录下“ResourceDictionary1.xaml”, ...
- POJ2431 Expedition(排序+优先队列)
思路:先把加油站按升序排列. 在经过加油站时.往优先队列里增加B[i].(每经过一个加油站时,预存储一下油量) 当油箱空时:1.假设队列为空(能够理解成预存储的油量),则无法到达下一个加油站,更无法到 ...
- AVC1与H264的差别
今天上网时偶尔发现这个在我脑海里疑惑的问题的答案. H.264 Video Types The following media subtypes are defined for H.264 video ...
- LF will be replaced by CRLF问题解决方法
[GIT] warning: LF will be replaced by CRLF问题解决方法 开发环境: 操作系统: windows xp ruby 1.9.2 rails 3.1.3 git v ...
- Android浏览图片,点击放大至全屏效果
做到照片浏览的功能,对于QQ空间中点击图片放大至全屏,感觉效果很赞,于是也做了个类似的效果.如下. 我不知道QQ那个是怎么做的,我的思路如下: 首先,从图片缩略界面跳转到图片详情页面,应该是从一个Ac ...
- js验证表单并提交
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- css布局&初始化&基准样式
学习css布局比较好的网站 学习css布局 1.css设置模块 typography(字体) colour(颜色) link(链接) forms(表单) layout(布局) navigation(导 ...
- 重学《C#高级编程》(序)
小生码农一枚,以前只是看别人写博客,从来没有想过要自己写博文,突然之间“脑抽”想自己也写点什么,遂在博客园开通这个博客. 简单介绍下自己吧,本人90后,父母对我没有大的想法,只是希望我平安成长,多学习 ...
- C# 解析嵌套的json文件.
概述 今天我同学问我如何转换json文件,没处理过,网上搜了一下,json转excel的很少,反过来倒是有许多人写了工具. json文件的结构大致是这样的: {, , }, , "type& ...
- RDD 重新分区,排序 repartitionAndSortWithinPartitions
需求:将rdd数据中相同班级的学生分到一个partition中,并根据分数降序排序. 此实例用到的repartitionAndSortWithinPartitions是Spark官网推荐的一个算子,官 ...