我知道这是稍有这里这个问题的重复:Blocking and waiting for an event重用类等待事件触发
然而,我是在写一个EventWaiter的过程中,遇到了一个问题。这里是一个(majorly)简化了什么,我一直在努力版本:
public class EventWaiter
{
private AutoResetEvent _autoResetEvent = new AutoResetEvent(false);
private EventInfo _event = null;
private object _eventContainer = null;
public EventWaiter(object eventContainer, string eventName)
{
_eventContainer = eventContainer;
_event = eventContainer.GetType().GetEvent(eventName);
}
public void WaitForEvent()
{
MethodInfo method = this.GetType().GetMethod("DynamicCaller");
Delegate handler = Delegate.CreateDelegate(this._event.EventHandlerType, this, method);
_event.AddEventHandler(_eventContainer, handler);
_autoResetEvent.WaitOne();
_event.RemoveEventHandler(_eventContainer, _handler);
}
public void DynamicCaller(/* insert magic here */)
{
_autoResetEvent.Set();
}
}
的使用将仅仅是:
EventWaiter ew = new EventWaiter(someClass, "someEvent");
ew.WaitForEvent();
基本上发生了什么,是其注册DynamicCaller
无效的此事件的处理程序。问题是,事件有不同的签名,我希望能够处理事件,而不管使用的代理。
我可以通过this._event.EventHandlerType获取委托类型,但是如何使用它创建一个完全可重用的类,而不管代理是什么?如果DynamicCaller参数与事件委托参数不完全相同,我会得到一个异常。作为一个便笺,我在框架中查了一大堆代码,如果我有权访问这些代码,我认为这很容易。太糟糕了,我需要的很多类都是框架内部的。
我想你可能想看看TaskCompletionSource的http://毫秒dn.microsoft.com/en-us/library/dd449174。aspx – 2012-08-12 17:45:29
@PeterRitchie:我看了一下,我可以看到它的实用性,但我没有看到这与此有关。它不能用于替代我的解决方案,它不能帮助解决我的问题。也许更多的信息,为什么你建议这将是有益的:) – caesay 2012-08-12 17:47:41
我不明白你为什么不能模板委托类型? – Hogan 2012-08-12 17:56:09