Asp.net异步IHttpAsyncHandler示例
/// <summary>
/// 异步IHttpHandler,实现了一个简单的统计流量的功能,
/// 由于是示例代码,所以没有判断IP或者MAC
/// </summary>
public class Handler1 : IHttpAsyncHandler
{
//默认访问量是0
static int visitCount = ;
/// <summary>
/// 这个HttpHandler的同步方法
/// </summary> /// <param name="context"></param>
public void ProcessRequest(HttpContext context)
{
} public bool IsReusable
{
get
{
return false;
}
} /// <summary>
/// 实现IHttpAsyncHandler 接口方法
/// </summary>
/// <param name="context">当前HttpContext</param>
/// <param name="cb">回调函数</param>
/// <param name="extraData"></param>
/// <returns></returns>
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
//这里可以加上判断IP或mac的方法
visitCount++;
//实例化AsyncUserVisiteCounterResult对象
AsyncUserVisiteCounterResult result = new AsyncUserVisiteCounterResult(cb, visitCount, context);
result.Display();
return result;
} /// <summary>
/// 结束本次IHttpAsyncHandler工作时触发的request方法
/// </summary>
/// <param name="result"></param>
public void EndProcessRequest(IAsyncResult result)
{ }
} /// <summary>
/// 自定义IAsyncResult 实现我们额外的Display方法
/// </summary>
public class AsyncUserVisiteCounterResult : IAsyncResult
{
//回调参数
private object _param;
//是否异步执行完成
private bool _asyncIsComplete;
//回调方法
private AsyncCallback _callBack;
//当前上下文
private HttpContext _context; public AsyncUserVisiteCounterResult(AsyncCallback callBack, object stateParam, HttpContext context)
{
this._callBack = callBack;
this._param = stateParam;
_asyncIsComplete = false;
this._context = context;
} public object AsyncState
{
get { return this._param; }
} /// <summary>
/// 等待句柄用于同步功能,关于等待句柄会在后续章节陈述
/// </summary>
public System.Threading.WaitHandle AsyncWaitHandle
{
get
{
return null;
}
} /// <summary>
/// 该属性表示不需要异步任务同步完成
/// </summary>
public bool CompletedSynchronously
{
get { return false; }
}
/// <summary>
/// 该属性表示异步任务是否已经执行完成
/// </summary>
public bool IsCompleted
{
get
{
return this._asyncIsComplete;
}
} /// <summary>
/// 自定义的额外功能,需要注意的是,执行完异步功能后
/// 要将_asyncIsComplete设置为true表示任务执行完毕而且
/// 执行回调方法,否则异步工作无法结束页面会卡死
/// </summary>
public void Display()
{
//这里先不用waitHandle句柄来实现同步
lock (this)
{
this._context.Response.Write("你是第" + (int)this._param + "位访问者,访问时间:"+DateTime.Now.ToString());
this._asyncIsComplete = true;
this._callBack(this);
}
} }
实例2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Threading;
namespace Comet_Handler
{
/// <summary>
/// Handler2 的摘要说明
/// </summary>
public class Handler2 : IHttpAsyncHandler
{
Func<int> f =() =>
{
Thread.Sleep();
int sum = ;
for (int i = ; i <= ; i++)
{
sum += i;
}
return sum;
}; public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
context.Response.ContentType = "text/plain";
IAsyncResult areault = f.BeginInvoke(cb, context);
return areault;
} public void EndProcessRequest(IAsyncResult result)
{
var context = result.AsyncState as HttpContext;
context.Response.Write(f.EndInvoke(result));
} public bool IsReusable
{
get { throw new NotImplementedException(); }
} public void ProcessRequest(HttpContext context)
{
throw new NotImplementedException();
}
}
}
实例三
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Threading;
namespace Comet_Handler
{
/// <summary>
/// Handler2 的摘要说明
/// </summary>
public class Handler2 : IHttpAsyncHandler
{ public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
context.Response.ContentType = "text/plain";
AsyncOperation areault = new AsyncOperation(context,cb, extraData);
areault.StartAsyncWork();
return areault;
} public void EndProcessRequest(IAsyncResult result)
{
// AsyncOperation res = (AsyncOperation)result; //var context = result.AsyncState as HttpContext;
//context.Response.Write(f.EndInvoke(result));
} public bool IsReusable
{
get { throw new NotImplementedException(); }
} public void ProcessRequest(HttpContext context)
{
throw new NotImplementedException();
}
}
public class AsyncOperation : IAsyncResult
{
HttpContext _context; //保存context的引用
AsyncCallback _cb;//保存回调委托的引用
object _state;//保存额外的信息
bool _iscomplate;//保存异步操作是否完成 /// <summary>
/// 构造函数,将AsyncHttpHandler的参数全部传递进来
/// </summary>
/// <param name="context"></param>
/// <param name="cb"></param> //该回调不可被重写,否则将会出现客户端永久等待的状态
/// <param name="state"></param> //构造时该值可以传递任意自己需要的数据
public AsyncOperation(HttpContext context, AsyncCallback cb, object state)
{
_context = context;
_cb = cb;
_state = state;
_iscomplate = false; //表明当前异步操作未完成
} /// <summary>
/// 实现获得当前异步处理的状态
/// </summary>
bool IAsyncResult.IsCompleted
{
get
{
return _iscomplate;
}
} /// <summary>
/// 返回 false 即可
/// </summary>
bool IAsyncResult.CompletedSynchronously
{
get
{
return false;
}
} /// <summary>
/// 将返回额外的信息
/// </summary>
object IAsyncResult.AsyncState
{
get
{
return _state;
}
} /// <summary>
/// 为空
/// </summary>
WaitHandle IAsyncResult.AsyncWaitHandle
{
get
{
return null;
}
}
public void send(string str)
{
_context.Response.Write(str);
}
/// <summary>
/// 表明开始异步处理的主函数(方法名可以改,但上面的调用也需要一起改)
/// </summary>
public void StartAsyncWork()
{
ThreadPool.QueueUserWorkItem(new WaitCallback(StartAsyncTask), null);//相信很多玩国.net winform 开发的一定认识
} private void StartAsyncTask(Object workItemState)
{
lock (this)
{
Thread.Sleep();
int sum = ;
for (int i = ; i <= ; i++)
{
sum += i;
}
_context.Response.Write(sum.ToString()); _iscomplate = true;
_cb(this);
}
} }
}
Asp.net异步IHttpAsyncHandler示例的更多相关文章
- Asp.Net异步编程-使用了异步,性能就提升了吗?
Asp.Net异步编程 写在前面的话,很久没有写Blog了,不对,其实一致就没有怎么写过.今天有空,我也来写一篇Blog 随着.Net4.5的推出,一种新的编程方式简化了异步编程,在网上时不时的也看到 ...
- 详解 ASP.NET异步
在前文中,介绍了.NET下的多种异步的形式,在WEB程序中,天生就是多线程的,因此使用异步应该更为谨慎.本文将着重展开ASP.NET中的异步. [注意]本文中提到的异步指的是服务器端异步,而非客户端异 ...
- Asp.Net异步编程
Asp.Net异步编程-使用了异步,性能就提升了吗? Asp.Net异步编程 写在前面的话,很久没有写Blog了,不对,其实一致就没有怎么写过.今天有空,我也来写一篇Blog 随着.Net4.5的推出 ...
- ASP.NET异步处理
前一篇:详解 .NET 异步 在前文中,介绍了.NET下的多种异步的形式,在WEB程序中,天生就是多线程的,因此使用异步应该更为谨慎.本文将着重展开ASP.NET中的异步. [注意]本文中提到的异步指 ...
- 重新理解:ASP.NET 异步编程
相关博文: 异步编程 In .NET(回味无穷!!!) ASP.NET sync over async(异步中同步,什么鬼?) 本来这篇博文想探讨下异步中的异常操作,但自己在做异步测试的时候,又对 A ...
- 重新理解:ASP.NET 异步编程(转)
http://www.cnblogs.com/xishuai/p/asp-net-async-await-and-exception-handling.html 相关博文: 异步编程 In .NET( ...
- ASP.NET 异步编程
ASP.NET 异步编程 相关博文: 异步编程 In .NET(回味无穷!!!) ASP.NET sync over async(异步中同步,什么鬼?) 本来这篇博文想探讨下异步中的异常操作,但自己在 ...
- C#异步Socket示例
C#异步Socket示例 概要 在C#领域或者说.net通信领域中有着众多的解决方案,WCF,HttpRequest,WebAPI,Remoting,socket等技术.这些技术都有着自己擅长的领域, ...
- 多线程异步编程示例和实践-Task
上篇博文中,我们介绍了Thread和ThreadPool: 多线程异步编程示例和实践-Thread和ThreadPool 本文中我们继续,说一下TPL(Task Parallel Library, 简 ...
随机推荐
- XMind快捷键可以自定义吗
在使用快捷键的时候,不知你是否有过这样的疑问,为什么这个操作的快捷键一定要是这个呢,我为什么不能换成其他的按键呢.其实这些在XMind思维导图中都是可以更改的,用户可以根据自己的操作习惯来定义快捷键命 ...
- 解决红米等手机(移动端)无法触发touchend事件
触屏事件的简单描述: js的触屏事件,主要有三个事件:touchstart,touchmove,touchend. 这三个事件最重要的属性是 pageX和 pageY,表示X坐标,Y坐标.touchs ...
- HDU 1559 最大子矩阵 (DP)
题目地址:pid=1559">HDU 1559 构造二维前缀和矩阵.即矩阵上的点a[i][j]表示左上方的点为(0,0),右下方的点为(i,j)的矩阵的和.然后枚举每一个矩阵的左上方的 ...
- oninput,onpropertychange,onchange的使用方法和差别
1.前言 因为工作须要,需实现一个相似于微博输入框的功能,在用户动态输入文字的时候,改动提示“您还能够输入XX字”.例如以下图所看到的: 因此,略微研究了一下oninput,onpropertycha ...
- PHP反射ReflectionClass、ReflectionMethod 入门教程
PHP反射ReflectionClass.ReflectionMethod 入门教程 作者:SNSGOU 发布于:2014-03-16 16:44:00 分类:PHP 浏览(6145) PHP5 ...
- 【计算几何初步:多边形中心】【HDU1115】Lifting the Stone
一.质点系重心公式 x=(x1*m1+x2*m2+x3*m3.....xn*mn)/M (M=m1+m2+m3+m4...+mn) 二.三角形重心 可直接求得,但在多边形剖分中 各三角形的质点的质量 ...
- MVCC图示
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页 回到顶级页面:PostgreSQL索引页 [作者:高健@博客园 luckyjackgao ...
- android——ObjectAnimator动画(一)
直接贴上集中用法 package com.example.test; import com.example.test.views.CircleView; import android.animatio ...
- ASP.NET基于donetCHARTING的自动报表
1,首先需要添加引用ChartExtents.dll和donetCHARTING.dll,资源百度大把. 2,配置图片生成类. using System; using System.Data; usi ...
- PHP学习笔记十四【面向对象】
<?php class Cat{ public $name; public $age; public $color; } //创建一个对象 $cat1=new Cat(); $cat1-> ...