Я вижу много кода, который просто вызывает обработчик событий следующим образом:
if( OnyMyEvent != null)
OnMyEvent(this,"args");
Но в этой статье Джеффри Шефера Основы реализации событий C#, лучшие практики и соглашения : 7) Код создания событий в CodeProject он описывает способ создания событий, чтобы подписчики исключений не влияет на рейзера. Мне любопытно, является ли это передовой практикой, которую следует применять.
Вот пример (не проверенный/не скомпилированный), чтобы читатели поняли идею:
public delegate void MessageReceivedEventHandler(object sender, MessageEventArgs e);
class MessageEventArgs : EventArgs
{
public string Message
{ get; set; }
public MessageEventArgs( string message )
{ this.Message = message; }
}
class EventTriggeringClass
{
public event MessageReceivedEventHandler MessageReceived;
protected virtual void OnMessageReceived( MessageEventArgs e )
{
this.RaiseTriggerOnMessageReceived( e );
}
private void RaiseOnMessageReceived( MessageEventArgs e )
{
MessageReceivedEventHandler handler = this.MessageReceived;
if ( handler != null )
{
Delegate[] eventHandlers = handler.GetInvocationList();
foreach ( Delegate currentHandler in eventHandlers )
{
MessageReceivedEventHandler currentSubscriber = ( currentHandler as MessageReceivedEventHandler );
try
{
currentSubscriber( this, e );
}
catch ( Exception ex )
{
Debug.Assert( ex == null, ex.Message, ex.ToString() );
}
}
}
}
public void Read()
{
bool foundMessage = false, hasMoreMessages = true;
string msg;
while( hasMoreMessages )
{
// this way or..
if( foundMessage )
this.OnMessageReceived( new MessageEventArgs( msg ) );
// the other way
if( MessageReceived != null )
MessageReceived(this, new MessageEventArgs( msg ) );
}
}
}