关于异步调用Discuz!NT接口

最近在做Discuz!NT论坛与网站整合的东西,于是便用到了Discuz提供的Discuz! Toolkit

看了看源码,应该说这是个不错的工具库,提供了关于注册、登录、 文章、积分等论坛操作的一篮子功能,而且配备了对应的Wiki

只可惜,Discuz!NT终归是异构的系统,响应速度和突发异常并非如自己的代码一样可控,使用同步方式调用API就显得有那么些不智了

好在Toolkit是开源的,可以DIY,看看它提供的同步访问Web Service方法:

Discuz.Toolkit.Util.GetResponseBytes

要进行异步的调用,原本的同步流程会被切成两部分:

1、调用开始等待响应

2、响应触发调用完成。

演化成语言:一个方法以委托的方式,在这两部分之间传递,第1部分会将方法指针(委托)塞入请求里,在流程执行到第2部分时,方法被取出回调。

先设计委托原型:

public delegate void GetResponseGeneric<T>(T objects);
异步请求数据结构:
RequestState

扩展一下Util工具类,加上异步调用接口方法:

异步方法
至此,与Discuz!NT的异步交互功能提供完成,怎么使用呢? 
假设需要异步获取某一版块指定数量的贴子,可以在DiscuzSession添加一个这样的方法:
Discuz.Toolkit.DiscuzSession.GetTopicListBegin

调用方使用起来只需要定义好接收方法,剩下就是收数据(CacheObjectCollection.HomepageTopicList是一个缓存项的getter/setter):

调用方

到此,异步调用框架完成,个人感觉很好。只是,需求变化成了生成静态页面,它便成了鸡肋……

Creative Commons License
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议
欢迎转载,但必须保留文章的署名老莫的帐本子
并保留此链接:http://moye.cnblogs.com/
如有疑问请发邮件:moyerock@gmail.com
原文地址:https://www.cnblogs.com/moye/p/discuznt_toolkit_async_api.html