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

周二刚过,离5.1小长假还有那么一阵,北京的天气已经开始热起来了。洗完澡,突然想起博客园一位大哥暂称呼元哥吧,当时我写了一篇windows服务的安装教程(http://www.cnblogs.com/mongo/p/4437934.html),元哥说想在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任务,大家也可以进行相应测试,希望这篇文档能对大家有帮助。

 

时间: 2024-08-26 03:29:19

.net中的"异步"-手把手带你体验的相关文章

Jquery扩展-手把手带你体验

Jquery扩展是在项目中经常用到的,有时候为了提取一些公共方法,有时候为了模块化管理等等,下面我们来体验一下.当然扩展离不开Jquery几个基础方法 1:$.extend() 2:$.fn.functionName 添加新的方法 介绍1:$.extend方法 (1):合并到Jquery全局变量 $.extend({ sayHi: function (content) { console.log("say:" + (content ? content : "default&q

Windows服务-手把手带你体验

Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用.还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务. 下面我们完成一个windows服务定时向mysql数据库中插入记录,come on! 1

Sqlserver作业-手把手带你体验

所谓Sql Server作业就是按照规定的时间执行指定的脚本,如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时,可以用管理-SQL Server代理-作业来实现. (1)打开Sqlserver,可以再sqlserver代理中看到作业这一项 (2)我们新建一个作业,我用的是自己测试数据库是一个算收益的作业,所以取名BankIncome (3)设置作业的步骤 指定数据库,设置批处理语句,当然可以点击分析进行审阅 (4)设置计划执行,相当于wind

别怕,手把手带你撕、拉、扯下SpringMVC的外衣

提到框架,就不得不提一下看源码,我们平时总是想求大神带我们飞,然而看源码就是一个向大神学习的最直接的一种方式,然而我们每次鼓起勇气看源码前是这样的但是一点开源码,顿时代码如洪流涌入,你的内心可能是这样的所以我在之前别怕看源码,一张图搞定Mybatis的Mapper原理的时候也提到过, Mybatis的源码相对其他框架而言比较简单, 比较适合刚开始克服恐惧心理看源码实战, 由于Struts2前不久又传出安全性问题, 所以Java开发中, 表现层框架基本都是SpringMVC,那么我们就来撕.拉.扯

手把手带你自制Linux系统之二 简易Linux制作

手把手带你自制Linux系统之二 简易Linux制作 本文利用CentOS5.5自带内核制作一个Mini Linux. 打开准备工作中创建的CentOS,为另一个虚拟机MiniLinux添加一个最小Linux所需要的文件. 1. 创建分区 为准备好的磁盘创建两个主分区,大小分别为20M和512M. 使用fdisk命令创建分区详细过程: fdisk /dev/hda 创建第一个20M分区依次输入: n --> p --> 1 --> <Enter> --> +20M 这几

Jquery中的异步编程浅析 延期(deferred)的承诺(promise)

引子 相信各位developers对js中的异步概念不会陌生,异步操作后的逻辑由回调函数来执行,回调函数(callback function)顾名思义就是"回头调用的函数",函数体事先已定义好,在未来的某个时候由某个事件触发调用,而这个时机,是程序本身无法控制的. 举几个常见例子: 事件绑定 动画 Ajax 上面的例子简单.典型,易于阅读和理解. 为了引出本文的主题,假设现在有3个ajax异步操作,分别为A.B.C,每个都封装成了函数,并可传入success回调作为参数. 请考虑以下场

Async in C# 5.0(C#中的异步编程Async) 蜗牛翻译之第一章

p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得这件事儿没意义翻译的又差,尽情的踩吧.如果你觉得值得鼓励,感谢留下你的赞,祝各位爱技术的园友在今后每一次应该猛烈突破的时候,不选择知难而退.在每一次应该独立思考的时候,不选择随波逐流,应该全力以赴的时候,不选择尽力

Android4.0中AppWidget的一些新玩意体验---RemoteViewsService

最近要把之前做的2.3上面的一些程序移植到4.0上面来,  几乎所有的AppWidget都是我一手操办, 所以这个玩意都是我弄. 我把Android2.3的代码直接拷到4.0的环境下面, 编译然后Push,  直接可以跑, 这是木有问题的.  但是我发现4.0上面有一些新东东是之前2.3上面没有的, 我也读了下官方的文档, 做了些demo, 这里总结给大家, 在以后需要做AppWidget的时候可以得心应手. 1: 应用列表中的预览图 如果你不想你的Widget在应用列表里面显示成那个丑机器人图

手把手带你搭建开发环境

俗话说得好,工欲善其事,必先利其器,开着记事本就想去开发 Android 程序显然不是明智之举,选择一个好的 IDE可以极大幅度地提高你的开发效率,因此本节我就将手把手带着你把开发环境搭建起来. 需要java环境jdk    jdk环境搭建教程 需要的软件 1.Android SDK Android SDK 是谷歌提供的 Android 开发工具包,在开发 Android 程序时,我们需要通过引入该工具包,来使用 Android 相关的 API 2. Eclipse     相信所有 Java