欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.net中的"异步"-手把手带你体验

程序员文章站 2022-07-02 19:01:55
 周二刚过,离5.1小长假还有那么一阵,元哥说想在web程序中调用windows服务,并且传递参数给他。首先这个问题我不知道,但是为了能不掉面子便问了一下使用场景为什么想...
 周二刚过,离5.1小长假还有那么一阵,元哥说想在web程序中调用windows服务,并且传递参数给他。首先这个问题我不知道,但是为了能不掉面子便问了一下使用场景为什么想这么做,这么一问,问题来了...元哥是程序已经完善,只是想在体验上更加一层,场景--->页面发出一个请求,请求到后台接受一定参数后要花费N秒做一件事情,很久很久,为了不让用户前端等待后就,元哥想参数到后台之后将当前处理转交给一个队列直接返回值给前台,这样前台的等待时间很短,后台任务得以进行。当然有些细节我可能没有表述完整,下面我们可以自己试试,体验一下.net中的非顺序执行。

 

 

 

模拟情况:请求,响应

 

请求代码

 

 

$.ajax({

       type: "POST",

       url: "/Sys_DongK/LongRequest",

       success: function (data) {

           if (data.suc) {

               console.log("success");

           }

       }

   });

响应代码我们让后台延迟10秒在相应

 

 

/// <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顺序执行委托 

 

 

//定义一个无返回类型的委托

 private delegate void BlockAction();

 

 

/// <summary>

/// 测试的请求

/// </summary>

/// <returns></returns>

[HttpPost]

public ActionResult LongRequest()

{

    BlockAction block = new BlockAction(ThreadSleep);

    block();

    return Json(new { suc = true });

}

 

 

  

 

1.2:异步委托 

 

 

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

 

 

线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

 

/// <summary>

/// 测试的请求

/// </summary>

/// <returns></returns>

[HttpPost]

public ActionResult LongRequest()

{

    Thread thread = new Thread(ThreadSleep);

    return Json(new { suc = true });

}

  

 

 

 

 2个小小的测试目的想让大家能体验一下非顺序执行,对于异步委托后续会用详细的文章进行补充,微软也推出了task任务,大家也可以进行相应测试,希望这篇文档能对大家有帮助。