К точке зрения TrueWill, вот пример хорошей реализации события и его метода повышения. Это событие Click
класса Button
от Microsoft. Сначала обратите внимание, что они используют EventHandlerList
для хранения назначений в ...
protected EventHandlerList Events {
get {
if (events == null) {
events = new EventHandlerList(this);
}
return events;
}
}
...
public event EventHandler Click {
add {
Events.AddHandler(EventClick, value);
}
remove {
Events.RemoveHandler(EventClick, value);
}
}
Теперь обратите внимание на фактический метод рейза OnClick
, он, вероятно, сильно отличается от того, что вы привыкли видеть ...
protected virtual void OnClick(EventArgs e) {
Contract.Requires(e != null);
EventHandler handler = (EventHandler)Events[EventClick];
if (handler != null) handler(this, e);
}
... не беспокойтесь о строке Contract.Requires(e != null);
, это их инфраструктура управления контрактами, но обратите внимание, что она извлекает ее из EventHandlerList
, а затем, если этот обработчик не null
, они ее запустят. 1014 *
Еще одна вещь, которую, вероятно, стоит здесь отметить, это то, что вам, вероятно, не нужно будет реализовывать свои события совершенно таким же образом, но руководство по программированию, выпущенное Microsoft, фактически выявляет условия гонки во второй части этого руководства. что TrueWill указывает. Вы можете найти это руководство здесь . На самом деле это одно очень хорошее руководство от Microsoft.
Теперь, к вашей точке , я считаю, что события должны быть проверены, и вот механизм, который я использовал в прошлом ...
private ManualResetEvent _eventRaised = new ManualResetEvent(false);
[TestMethod]
public void TestSomething()
{
_eventRaised.Reset();
// hook up the event to the target being tested
// NOW, in the event handler, issue _eventRaised.Set();
// do something to raise the event
_eventRaised.WaitOne();
}