周二刚过,离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. Linux 动画显示

    Linux最强大的一个特征就是它有大量的各种小命令工具,这也可以称做是它最有趣的一个地方了.在这些大量的有用的命令和脚本中,你会发现有少部 分命令工具不那么有用的——如果你不愿意说是完全没用处的话.你 ...

  2. C# 常用控件及单击事件

    1.窗体 1.常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体. (2)WindowState属性: 用来获取或设置窗体的窗口状态. 取值有三种: No ...

  3. c# webbrowser 随机点击链接

    HtmlElementCollection hec = webBrowser1.Document.All; ; i < hec.Count; i++) { if (hec[i].GetAttri ...

  4. Android自动化测试之Monkeyrunner从零开始(三)

    转自http://www.51testing.com/html/81/22381-854342.html 时光过得太快了,一晃离上一篇monkeyrunner系列的博客已经一年多了.这一年多时间经历了 ...

  5. .propertie文件注释

    在.properties文件中注释,前边加#就可以

  6. JAVA将Excel中的报表导出为图片格式(一)问题背景

    如题所示,先抛出一个问题,如何使用JAVA将Excel中的报表导出为图片格式? 首先说一下这个问题的背景,也就是为什么博主会碰到这个问题 随着微信,易信之流大行其道,企业内部的办公交流.绩效考评甚至考 ...

  7. poj1088

    这题是dp还是dfs+记忆化?(其实好像没什么区别?) 用f[i,j]表示滑到(i,j)时之后最多能滑多远,依次穷举每一个起点(i,j)则 f[i,j]=max{f[i,j-1],f[i-1,j],f ...

  8. C#4.0新特性(3):变性 Variance(逆变与协变)

    一句话总结:协变让一个粗粒度接口(或委托)可以接收一个更加具体的接口(或委托)作为参数(或返回值):逆变让一个接口(或委托)的参数类型(或返回值)类型更加具体化,也就是参数类型更强,更明确. 通常,协 ...

  9. easyui-dialog中文件上传处理

    function openDialog() { // $('#dlg').dialog('open'); //EasyUi的dialog中文件上传,后台获取不到文件,需要改写为下面这样 $(" ...

  10. UVa 10817 (状压DP + 记忆化搜索) Headmaster's Headache

    题意: 一共有s(s ≤ 8)门课程,有m个在职教师,n个求职教师. 每个教师有各自的工资要求,还有他能教授的课程,可以是一门或者多门. 要求在职教师不能辞退,问如何录用应聘者,才能使得每门课只少有两 ...