.net中的"异步"
模拟情况:请求,响应
请求代码
1
2
3
4
5
6
7
8
9
|
$.ajax({ type: "POST" , url: "/Sys_DongK/LongRequest" , success: function (data) { if (data.suc) { console.log( "success" ); } } }); |
响应代码我们让后台延迟10秒在相应
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/// <summary> /// 线程休息的方法 /// </summary> public void ThreadSleep() { Thread.Sleep(10000); } /// <summary> /// 测试的请求 /// </summary> /// <returns></returns> [HttpPost] public ActionResult LongRequest() { ThreadSleep(); return Json( new { suc = true }); } |
效果刷新页面大家可以看到该请求耗时10秒
测试方案 异步委托,线程
first:异步委托
委托本质上是一个类,定义了方法的规则,满足这些规则的方法便可归咎与我,听我派遣,当然手下有时候不止一个人,那我可以容纳很多满足我规则的方法,我在内部维护一个委托列表,调用多播委托时候,将按照委托列表顺序执行。我还有三个重要的方法BeginInvoke,EndInvoke,Invoke
1.1顺序执行委托
1
2
|
//定义一个无返回类型的委托 private delegate void BlockAction(); |
1
2
3
4
5
6
7
8
9
10
11
|
/// <summary> /// 测试的请求 /// </summary> /// <returns></returns> [HttpPost] public ActionResult LongRequest() { BlockAction block = new BlockAction(ThreadSleep); block(); return Json( new { suc = true }); } |
1.2:异步委托
1
2
3
4
5
6
7
8
9
10
11
|
/// <summary> /// 测试的请求 /// </summary> /// <returns></returns> [HttpPost] public ActionResult LongRequest() { BlockAction block = new BlockAction(ThreadSleep); IAsyncResult result = block.BeginInvoke( null , null ); return Json( new { suc = true }); } |
大家看到时间少了很多,当然我只是简单的测试,对于异步委托的说明不多,而且我这种没有等待异步委托的结果。
second:线程
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
1
2
3
4
5
6
7
8
9
10
|
/// <summary> /// 测试的请求 /// </summary> /// <returns></returns> [HttpPost] public ActionResult LongRequest() { Thread thread = new Thread(ThreadSleep); return Json( new { suc = true }); } |
2个小小的测试目的想让大家能体验一下非顺序执行,对于异步委托后续会用详细的文章进行补充,微软也推出了task任务,大家也可以进行相应测试,希望这篇文档能对大家有帮助。
分类: .net