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, 简 ...
随机推荐
- C#listbox使用方法
1. 属性列表: SelectionMode 组件中条目的选择类型,即多选(Multiple).单选(Single) Rows 列表框中显示总共多少行 Sel ...
- [LeetCode] Interleaving String [30]
题目 Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example, Given: ...
- 如何统一删除word中的超链接
[摘要] 我们从别处拷贝文字,或从网上复制的文字,里面有很多超级链接,如何可以批量删除这些链接呢?这里介绍两种批量删除链接的方法. [正文] 方法一:使用快捷键删除超链接 有个神奇的快捷键,可以帮我们 ...
- Ansible@一个有效的配置管理工具--Ansible configure management--翻译(十二)
如果没有书面授权,请勿转载 第五章 自己定义模块 External inventories In the first chapter we saw how Ansible needs an inven ...
- Unity 3D 连接Mysql数据库
要想使用Unity直接连接数据库需要以下几个动态库
- NET基础课--异常处理X
通常不建议如下的捕获方式 正确的方法是:某一功能函数的入口捕获基本异常即exception,分支方法或片段方法中捕获特定异常 高级: 另附:Fxcop异常监控工具
- C# LiNq的语法以及常用的扩展方法
首先先来扯一下,这篇博文是我第一次写的,主要是我的一些摘录,希望对大家有所帮助. Linq的基础 •LINQ(读音link):Linq To SQL(过时).Linq To Object.Linq T ...
- ASP.net+SQL server2008简单的数据库增删改查 VS2012
工具:VS2012 数据库:SQL server 简单说明:根据老师上课给的代码,进行了简单的改正适用于VS2012环境,包括注册.登录.查询.修改.删除功能,多数参考了网上的代码 百度云源代码连接t ...
- c# 面相对象1-概括
面向对象和面向过程的区别 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了. 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为 ...
- Tomcat地址栏传中文参数乱码问题处理
javascript中有时需要向后台传递中文参数,再次展示到前台时显示为乱码,解决方案: 方案1:修改Tomcat-conf-server.xml文件 大约69-71行 修改为: <Conne ...