zoukankan      html  css  js  c++  java
  • 异步

    .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

  • 相关阅读:
    POJ 1724 ROADS【最短路/搜索/DP】
    UVA 12716 GCD XOR【异或】
    UVA 10375 Choose and divide【唯一分解定理】
    UVA 12169 Disgruntled Judge【扩展欧几里德】
    UVA 11582 Colossal Fibonacci Numbers!【数学】
    011.progit笔记---git变基rebase
    010.progit笔记---git多个远程分支
    009.progit笔记---git单个远程分支
    008.progit笔记---git分支
    007.progit笔记---git别名
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4449296.html
Copyright © 2011-2022 走看看