/// <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示例的更多相关文章

  1. Asp.Net异步编程-使用了异步,性能就提升了吗?

    Asp.Net异步编程 写在前面的话,很久没有写Blog了,不对,其实一致就没有怎么写过.今天有空,我也来写一篇Blog 随着.Net4.5的推出,一种新的编程方式简化了异步编程,在网上时不时的也看到 ...

  2. 详解 ASP.NET异步

    在前文中,介绍了.NET下的多种异步的形式,在WEB程序中,天生就是多线程的,因此使用异步应该更为谨慎.本文将着重展开ASP.NET中的异步. [注意]本文中提到的异步指的是服务器端异步,而非客户端异 ...

  3. Asp.Net异步编程

    Asp.Net异步编程-使用了异步,性能就提升了吗? Asp.Net异步编程 写在前面的话,很久没有写Blog了,不对,其实一致就没有怎么写过.今天有空,我也来写一篇Blog 随着.Net4.5的推出 ...

  4. ASP.NET异步处理

    前一篇:详解 .NET 异步 在前文中,介绍了.NET下的多种异步的形式,在WEB程序中,天生就是多线程的,因此使用异步应该更为谨慎.本文将着重展开ASP.NET中的异步. [注意]本文中提到的异步指 ...

  5. 重新理解:ASP.NET 异步编程

    相关博文: 异步编程 In .NET(回味无穷!!!) ASP.NET sync over async(异步中同步,什么鬼?) 本来这篇博文想探讨下异步中的异常操作,但自己在做异步测试的时候,又对 A ...

  6. 重新理解:ASP.NET 异步编程(转)

    http://www.cnblogs.com/xishuai/p/asp-net-async-await-and-exception-handling.html 相关博文: 异步编程 In .NET( ...

  7. ASP.NET 异步编程

    ASP.NET 异步编程 相关博文: 异步编程 In .NET(回味无穷!!!) ASP.NET sync over async(异步中同步,什么鬼?) 本来这篇博文想探讨下异步中的异常操作,但自己在 ...

  8. C#异步Socket示例

    C#异步Socket示例 概要 在C#领域或者说.net通信领域中有着众多的解决方案,WCF,HttpRequest,WebAPI,Remoting,socket等技术.这些技术都有着自己擅长的领域, ...

  9. 多线程异步编程示例和实践-Task

    上篇博文中,我们介绍了Thread和ThreadPool: 多线程异步编程示例和实践-Thread和ThreadPool 本文中我们继续,说一下TPL(Task Parallel Library, 简 ...

随机推荐

  1. js获取浏览器的keydown事件(附keycode码)

    <script type="text/javascript" language=JavaScript charset="UTF-8"> docume ...

  2. JNI_最简单的Java调用C/C++代码

    JNI_最简单的Java调用C/C++代码 JNI.是Java Native Interface的简称,中文是"Java本地调用".通过这种技术能够做到下面两点: Java程序中的 ...

  3. 两分钟让你明白cocos2dx的屏幕适配策略

    闲来无事,整理了一下cocos2dx的屏幕适配策略,本文适用于想快速理解cocos2dx适配的开发者. 我们先假设:以854 * 480 的屏幕为标准进行开发,当然,这也就是cocos2dx所说的设计 ...

  4. JAVA HashMap与HashTable 区别

    HashTable和HashMap区别 第一,继承不同. public class Hashtable extends Dictionary implements Mappublic class Ha ...

  5. Springmvc和velocity使用的公用后台分页

    Springmvc和velocity使用的公用后台分页 类别                    [选择一个类别或键入一个新类别] Springmvc和velocity使用的公用后台分页 样式: 使 ...

  6. Android的Activity屏幕切换滑动动画

    Activity的切换效果使用的是Android的动画效果,Android的动画在官方有相关资料:http://developer.android.com/guide/topics/graphics/ ...

  7. iOS 使用自定义的字体

    一.新建一个工程,准备好要使用的字体,后缀为.ttf或者.otf格式. 二.将字体直接拖入工程项目中. 三.在Info.plist中添加一个新的Key:Fonts provided by applic ...

  8. C语言-运算符与表达式

    运算符分类: 算术运算符:+   -  *    /          % 关系运算符:>  <  =  <=  >= ==  != 逻辑运算符:&& || ! ...

  9. 显示Title和隐藏Title的ListView

    一.主要步骤 ①.调用ListView的addHeaderView(),创建一个与Title一样高的View,这样ListView就不会刚开始被遮盖了 ②.调用ListView的setOnTouchE ...

  10. mysql拒绝访问(Error 1044/1045)问题的解决

    遇到此问题 一般是权限问题 修改权限即可 然后用grant命令下放权限. GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY 'ro ...