雷兽,我的哔哩哔哩直播间https://live.bilibili.com/23575114

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

以前一直很懒  碰到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; }
}
}

posted on 2016-03-25 09:54  雷兽  阅读(1930)  评论(1编辑  收藏  举报