以前一直很懒 碰到ashx要用await异步就绕开 用aspx 或者mvc异步控制器 这次公司需要 我查了国内的文章基本都不能简单copy来处理一堆错关键的过程中函数BeginProcessRequest和endxxx的代码是缺失的 结果我去stackoverflow.com查,才找到一段内容,贴在这里 以备自己后用 也希望之后能帮助喜欢搜索解决问题 的大家。
关键其实就在Nito.AsyncEx这个库 nuget可以下载到 有3个dll,是异步 的一些封装,顺便吐槽一下 到现在很多人还不习惯用nuget 真不知道是我大天朝网络神盾太厉害,还是这些位。。。。算了不说了 呵呵
/// <summary>
/// HttpAsyncHandlerTestAsync 的摘要说明 /// </summary> public class HttpAsyncHandlerTestAsync : HttpAsyncHandlerBase { /// <summary> /// 需要HttpAsyncHandlerBase类 /// 需要Nito.AsyncEx、Nito.AsyncEx.Concurrent、Nito.AsyncEx.Enlightenment相关dll /// </summary> /// <param name="context"></param> /// <returns></returns> public override async Task ProcessRequestAsync(HttpContext context) { context.Response.ContentType = "text/xml"; //传递context 只是模拟一下传参 string data = null; try { data = await DoSomething(0); } catch(Exception oe) { data = oe.Message+oe.StackTrace; } context.Response.Write(data); }public async Task<string> DoSomething(int x = 0)
{//调用Delay 只是为了找个地方await 正常情况这里应该是await一个io行为
await Task.Delay(0);return (1 / x).ToString();
} }
public abstract class HttpAsyncHandlerBase : IHttpAsyncHandler
{ public abstract Task ProcessRequestAsync(HttpContext context);public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{ var task = ProcessRequestAsync(context); return Nito.AsyncEx.AsyncFactory.ToBegin(task, cb, extraData); }public void EndProcessRequest(IAsyncResult result)
{ Nito.AsyncEx.AsyncFactory.ToEnd(result); }public void ProcessRequest(HttpContext context)
{ EndProcessRequest(BeginProcessRequest(context, null, null)); }public virtual bool IsReusable
{ get { return true; } } }