异步等待回调事件
虽然 .NET BCL 中提供了大量的异步API,但是有些时候,我们会遇到没有异步API的组件。
例如,某个第三方组件,它的内部执行过程比较耗时,它采用完成事件通知的方式来通知调用方。
示例代码如下:
public class Xjob {
// 启动任务
public void Start(string state){
// 启动后台操作,有可能是交给硬件处理
// 这个方法会立即返回
}
// 任务执行完成的事件通知
public event EventHandler<OnCompletedArgs> OnCompleted;
}
对于这样一个组件,如果我们希望在 Web服务或者后台作业中调用,就非常麻烦,你可以自己思考下该如何实现~~~
为了解决这类问题,可以使用 ClownFish 提供的 ResultWaiter 来调用,示例代码如下:
public async Task<ActionResult> HttpAction1() {
using ResultWaiter waiter = new ResultWaiter();
Xjob xjob = new Xjob();
xjob.OnCompleted += XjobOnCompleted;
xjob.Start(waiter.ResultId);
var result = await waiter.WaitAsync(TimeSpan.FromSeconds(30));
// 处理 Xjob 的执行结果 ………………
}
private static void XjobOnCompleted(object sender, OnCompletedArgs e) {
string resultId = e.State;
ResultWaiter waiter = ResultWaiter.GetById(resultId);
if( waiter != null ){
if( e.Exception != null)
waiter.SetException(e.Result);
else
waiter.SetResult(e.Result);
}
}