博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Asp.net MVC 3 异步操作
阅读量:6859 次
发布时间:2019-06-26

本文共 3262 字,大约阅读时间需要 10 分钟。

     在 Asp.net MVC 应用程序中,有时间需要执行一些异步操作。那么 Asp.net MVC 下的异步请求是怎么一个过程呢?  异步被调用时,发生以下过程:

1. Web服务器从线程池得到一个线程(工作线程),接着安排它来处理进来的请求,该工作线程启动一个异步操作。

2. 工作线程被线程池收回,为另一个Web请求服务。

3. 当异步操作完成后,它会通知ASP.NET。

4. Web服务器从线程池获取一个工作线程(这可能是一个不同的开始异步操作的线程)来处理剩余的请求,包括呈现与响应请求。

看下面的模式图:

接着,我们来看Controller的代码:

1:      public class HomeController : AsyncController
2:      {
3:          public void IndexAsync()
4:          {
5:              AsyncManager.OutstandingOperations.Increment(2);
6:   
7:              Task.Factory.StartNew(() =>
8:                                        {
9:                                            // Perform some expensive operation
10:                                            string uri = "http://www.cnblogs.com";
11:   
12:                                            WebClient client = new WebClient();
13:                                            string reply = client.DownloadString(uri);
14:   
15:                                            AsyncManager.Parameters["data"] = reply;
16:                                            AsyncManager.OutstandingOperations.Decrement();
17:                                        });
18:              Task.Factory.StartNew(() =>
19:                                        {
20:                                            // Perform another expensive operation
21:                                            string uri = "http://www.cnblogs.com/wintersun/";
22:   
23:                                            WebClient client = new WebClient();
24:                                            string reply = client.DownloadString(uri);
25:   
26:                                            AsyncManager.Parameters["moredata"] = reply;
27:                                            AsyncManager.OutstandingOperations.Decrement();
28:                                        });
29:          }
30:   
31:          public ActionResult IndexCompleted(string data, string moredata)
32:          {
33:              Operations translations = new Operations { FirstOperation = data, SecondOperation = moredata };
34:   
35:              return View(translations);
36:          }
37:   
38:      }

我们看到上面的代码让Controller继承自AsyncController,那个叫IndexAsync的action对应是Index的View。中间的代码使用来模拟下载网页内容,最后在完成后又通过AsyncManager.Parameters字典传值给IndexCompleted的Action, 有注意Key的名称moredata与IndexCompleted Action的参数名moredata相同。AsyncManager下的Parameters字典用于转递一组参数值到最后异步调用的方法。 下有一个管理异步操作的计数器,应当务必确保执行异步操作后,执行方法,甚至异步操作失败,当所有线程完成时这个计数器的值必须为0。 当异步调用我们让View返回:

1:  <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage
" %>
2:  
3:  
4:  
5:      Translate Completed
6:  
7:  
8:      
9:          The controller has completed.
10:      
11:  
12:  

使用到一个简单Model:

public class Operations
{
public string FirstOperation { get; set; }
public string SecondOperation { get; set; }
}

好了,那么什么时候用异步,什么用同步呢?

当这些条件满足的情况下,可以考虑使用异步:

1. 密集​​地操作的网络或I/O,而不是CPU密集运算的。

2. 测试结果表明阻塞操作是网站的性能瓶颈,为了让IIS服务器可以处理更多的请求,在处理这些阻塞调用时使用异步Action方法。
3. 并行化比简单代码更重要。
4. 需要提供一种机制,允许用户取消一个长期运行任务的请求。

实际开发,你需要测试是否异步操作可以提高性能。同时,在某些情况下可能话,增加IIS每个CPU配置最大并发请求处理和最大并发线程。

关于Asp.net 服务器线程配置看这篇文章:
关于是否需要数据库异步调用看这里:
我们介绍到这儿,有兴趣可以自己尝试一下,后面有时间将介绍Asp.net MVC 4 与 .net framework 4.5 的异步操作。

 

作者:
出处:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-。

你可能感兴趣的文章
把可视化从业者的生存现状可视化出来:他们是谁?
查看>>
Flutter Web - 目标全平台开发的Flutter再下一城!
查看>>
RAID-10 阵列的创建(软)
查看>>
小白学爬虫-批量部署Splash负载集群
查看>>
dubbo源码分析-服务端发布流程-笔记
查看>>
小菜鸡进阶之路-First week
查看>>
基于easyui的文档管理系统springmvc+mybaits实现
查看>>
linux 安装 node
查看>>
“不劳而获”的数字货币真的存在么?
查看>>
k8s拾遗 - Secret
查看>>
Android SparseArray 原理解析
查看>>
PHP类的定义
查看>>
Composer 中国镜像地址配置
查看>>
二层设备与三层设备的区别--总结
查看>>
怎样使用 CCache 进行 cocos2d-x 编译加速
查看>>
View的setTag()与getTag()方法使用
查看>>
2009年云数据库的开发和应用前景(转载)
查看>>
咏南中间件更新日志
查看>>
在rem布局下使用背景图片以及sprite
查看>>
JAVA设计模式之【抽象工厂模式】
查看>>