我知道這是稍有這裏這個問題的重複: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