ASP.NET MVC什么时候使用异步Action_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > ASP.NET MVC什么时候使用异步Action

ASP.NET MVC什么时候使用异步Action

 2015/4/18 10:55:06  Darren Ji  程序员俱乐部  我要评论(0)
  • 摘要:在没有使用异步Action之前,在Action内,比如有如下的写法:publicActionResultIndex(){CustomerHelpercHelper=newCustomerHelper();List<Customer>result=cHelper.GetCustomerData();returnView(result);}以上,假设,GetCustomerData方法是调用第三方的服务,整个过程都是同步的,大致是:→请求来到Index这个Action→ASP
  • 标签:.net ASP.NET MVC 使用 net 什么 异步

在没有使用异步Action之前,在Action内,比如有如下的写法:

 

monospace; width: 100%; margin: 0em; background-color: #f0f0f0">public ActionResult Index()
{
    CustomerHelper cHelper = new CustomerHelper();
    List<Customer> result = cHelper.GetCustomerData();
    return View(result);
}

 

以上,假设,GetCustomerData方法是调用第三方的服务,整个过程都是同步的,大致是:

 

→请求来到Index这个Action
→ASP.NET从线程池中抓取一个线程
→执行GetCustomerData方法调用第三方服务,假设持续8秒钟的时间,执行完毕
→渲染Index视图

 

在执行执行GetCustomerData方法的时候,由于是同步的,这时候无法再从线程池抓取其它线程,只能等到GetCustomerData方法执行完毕。

 

这时候,可以改善一下整个过程。

→请求来到Index这个Action
→ASP.NET从线程池中抓取一个线程服务于Index这个Action方法
→同时,ASP.NET又从线程池中抓取一个线程服务于GetCustomerData方法
→渲染Index视图,同时获取GetCustomerData方法返回的数据

 

所以,当涉及到多种请求,比如,一方面是来自客户的请求,一方面需要请求第三方的服务或API,可以考虑使用异步Action。

 

假设有这样的一个View Model:

 

public class Customer
{
    public int Id{get;set;}
    public Name{get;set;}
}

 

假设使用Entity Framework作为ORM框架。

 

public class CustomerHelper
{
	public async Task<List<Customer>> GetCustomerDataAsync()
	{
		MyContenxt db = new MyContext();
		var query = from c in db.Customers
					orderby c.Id ascending
					select c;
		List<Customer>	result = awai query.ToListAsycn();
		return result;				
	}
}

 

现在就可以写一个异步Action了。

 

public async Task<ActionResult> Index()
{
	CustomerHelper cHelper = new CustomerHelper();
	List<Customer> result = await cHlper.GetCustomerDataAsync();
	return View(result);
}

 

Index视图和同步的时候相比,并没有什么区别。

 

@model List<Customer>
@foreach(var customer in Model)
{
	<span>@customer.Name</span>
}

 

当然,异步还设计到一个操作超时,默认的是45秒,但可以通过AsyncTimeout特性来设置。

 

[AsyncTimeout(3000)]
public async Task<ActionResult> Index()
{
	...
}

 

如果不想对操作超时设限。

 

[NoAsyncTimeout]
public async Task<ActionResult> Index()
{
	...
}

 

 

综上,当涉及到调用第三方服务的时候,就可以考虑使用异步Action。async和await是异步编程的2个关键字,async总和Action成对出现,而在调用异步方法之前要加上await关键字。

发表评论
用户名: 匿名