Reference:
Mcad学习笔记之异步编程(AsyncCallback委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)
http://www.cnblogs.com/aierong/archive/2005/05/25/162308.html
Mcad学习笔记之委托再理解(delegate的构造器,BeginInvoke,EndInvoke,Invoke4个方法的探讨)
http://www.cnblogs.com/aierong/archive/2005/05/25/162181.html
简直是经典的文章。一下子解决了我对IAsyncResult的理解。
实际上ASP.NET的异步模式可以有4种,灵活运用IAsyncResult提供的函数能够实现。我将使用AsyncEventHandler这个代理完成我所有的异步操作。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/zc22/4b429c8d02000cvp.jpg)
缓冲层部分核心代码:
public
delegate
void
AsyncEventHandler();
//
声明一个异步代理
public
class
ConnectionPipe
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
private event AsyncEventHandler asy;//实例化代理
private ContentFetcher fetcher;//获取数据类
public IAsyncResult BeginCalling(AsyncCallback cb, string param)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (cb == null)
throw new Exception("Missing Para!");
if (param == null || param == "")
throw new Exception("Missing Para!");
fetcher = new ContentFetcher(PathMappingController.Instance.getPath(param));
asy = new AsyncEventHandler(fetcher.Fetching);
return asy.BeginInvoke(new AsyncCallback(cb), this);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public void EndCalling(IAsyncResult ar)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (asy == null)
throw new Exception("Run BeginCalling First!");
asy.EndInvoke(ar);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public string Content
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
get ...{ return fetcher.Content; }
}
}
页面代码:
public
partial
class
SubPages_03projects_Lenovo : System.Web.UI.Page
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
protected string pageContent;
protected void Page_Load(object sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
AddOnPreRenderCompleteAsync(
new BeginEventHandler(BeginAsyncOperation),
new EndEventHandler(EndAsyncOperation)
);
}
IAsyncResult BeginAsyncOperation(object sender, EventArgs e,
AsyncCallback cb, object state)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
ConnectionPipe pipe = new ConnectionPipe();
return pipe.BeginCalling(cb, "testme");
}
void EndAsyncOperation(IAsyncResult ar)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
(ar.AsyncState as ConnectionPipe).EndCalling(ar);
pageContent = (ar.AsyncState as ConnectionPipe).Content;
}
}
思想:
。页面启动,异步调用ConnectionPipe获取数据。
。当数据获取完毕,自动调用结束。
。使用了代理里面提供的异步操作:BeginInvoke,EndInvoke,这样我不要自己实现接口IAsyncResult.
。当代理的方法操作完成,代理会自动调用AsyncCallback。这个省了我很多麻烦。
asp.net异步学习完毕。