.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:线程
/// <summary> /// 测试的请求 /// </summary> /// <returns></returns> [HttpPost] public ActionResult LongRequest() { Thread thread = new Thread(ThreadSleep); return Json(new { suc = true }); }
2个小小的测试目的想让大家能体验一下非顺序执行,对于异步委托后续会用详细的文章进行补充,微软也推出了task任务,大家也可以进行相应测试,希望这篇文档能对大家有帮助。