异步等待回调事件

虽然 .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);
	 }
}