异步

.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(nullnull);
    return Json(new { suc = true });
}

    

大家看到时间少了很多,当然我只是简单的测试,对于异步委托的说明不多,而且我这种没有等待异步委托的结果。

second:线程 

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪阻塞运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程
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

原文地址:https://www.cnblogs.com/Leo_wl/p/4449296.html