zoukankan      html  css  js  c++  java
  • ASP.NET MVC什么时候使用异步Action

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

    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关键字。

    转自:https://www.cnblogs.com/darrenji/p/4436764.html

  • 相关阅读:
    (组合游戏)SG函数与SG定理详解
    第十六场快乐数学赛
    Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020
    L1-048 矩阵A乘以B (15分)
    华东交通大学2019年ACM 双基 程序设计竞赛 个人题解(A
    第十五次开心场
    L1-020 帅到没朋友 (20分)
    L1-018 大笨钟 (10分)
    Educational Codeforces Round 97 (Rated for Div. 2) (A
    [Python自学] day-6 (编程范式、类、继承)
  • 原文地址:https://www.cnblogs.com/lvxiangjack/p/10430167.html
Copyright © 2011-2022 走看看