周二刚过,离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任务,大家也可以进行相应测试,希望这篇文档能对大家有帮助。

 

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

  1. 手把手带你体验鸿蒙 harmonyOS

    wNlRGd.png 前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 GIthub 博客 学习导图 image.png 一.为什么要尝鲜 harmonyos? wNlfx ...

  2. Jquery扩展-手把手带你体验

    Jquery扩展是在项目中经常用到的,有时候为了提取一些公共方法,有时候为了模块化管理等等,下面我们来体验一下.当然扩展离不开Jquery几个基础方法 1:$.extend() 2:$.fn.func ...

  3. 手把手带你体验Stream流

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 上一篇讲解到了Lambda表达式的使用<最近学 ...

  4. Sqlserver作业-手把手带你体验

    所谓Sql Server作业就是按照规定的时间执行指定的脚本,如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时,可以用管理-SQL Server代 ...

  5. Windows服务-手把手带你体验

    Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而 ...

  6. .NET中的异步编程

    开篇 异步编程是程序设计的重点也是难点,还记得在刚开始接触.net的时候,看的是一本c#的Winform实例教程,上面大部分都是教我们如何使用Winform的控件以及操作数据库的实例,那时候做的基本都 ...

  7. Android:手把手带你深入剖析 Retrofit 2.0 源码

    前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库 今天,我将手把手带你深入剖析Retrofit v2.0的源码,希望你们会喜 ...

  8. 看stackoverflow大牛如何回答何时在ASP.NET中使用异步控制器?

    转载自博客园:http://farb.cnblogs.com/ 今天无意中看到stackoverflow上一个很好的问答,个人觉得很有价值,所以翻译过来和大家共享!希望大家能相互交流. 在ASP.NE ...

  9. 如何在单元测试中测试异步函数,block回调这种

    大概有四种方法: runloop 阻塞主进程等待结果 semphaore 阻塞主进程等待结果 使用XCTestExpectation 阻塞主线程等待(我用这个,xcode自带的,为啥不用) 使用第三方 ...

随机推荐

  1. QC、IQC、IPQC、FQC、OQC、QA分别的定义

    QC:即英文(Quality Control)的简称,中文意义是品质控制,其在ISO8402:1994的定义是“为达到品质要求所采取的作业技术的活动”.有些推行ISO9000的组织会设置这样一个部门或 ...

  2. python 下划线的使用(转载:安生犹梦 新浪博客)

    Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx      不能用'from module import *'导入 __xxx__ 系统定义名字 __xxx    类中的私有变量名 核 ...

  3. linux查看硬件环境

    一:查看cpu more /proc/cpuinfo | grep "model name" grep "model name" /proc/cpuinfo 如 ...

  4. org.hibernate.PersistentObjectException: detached entity passed to persist异常

    再用jpa+spring+struts2开发的是时候遇到一个问题(采用了注解的方式,xml配置的道理是一样的),当我在注册用户的时候,注册第一个用户没有问题,但注册第二个用户开始就会抛出一个异常: j ...

  5. Android viewPage notifyDataSetChanged无刷新

    转载 http://www.67tgb.com/?p=624 最近项目结束,搞了一次代码分享.其中一位同学分享了一下自己在解决问题过程中的一些心得体会,感觉受益匪浅.整理出来,分享给大家. 建议使用自 ...

  6. NDK(21)JNI的5大正确性缺陷及优化技巧(注意是正确性缺陷)

    转自 : http://www.ibm.com/developerworks/cn/java/j-jni/index.html JNI 编程缺陷可以分为两类: 性能:代码能执行所设计的功能,但运行缓慢 ...

  7. Cookie的具体使用之来存储对象

    1.创建一个新的cookie,并赋值. HttpCookie cookie;       cookie=new HttpCookie("user");       cookie.D ...

  8. UVa 11722 (概率 数形结合) Joining with Friend

    高中也做个这种类似的题目,概率空间是[t1, t2] × [s1, s2]的矩形,设x.y分别代表两辆列车到达的时间,则两人相遇的条件就是|x - y| <= w 从图形上看就是矩形夹在两条平行 ...

  9. listagg 函数

    listagg 函数--oracle 11g release 2 转载:http://xpchild.blog.163.com/blog/static/10180985920108485721969/ ...

  10. sql 游标循环当中重新赋值

    sql 游标循环当中的变量必须重新赋值不然变量的值就是前次循环的值