次のようなことをしたくなるので、少し危険な構造だと思います。
MyEvent(this, EventArgs.Empty);
クライアントが例外をスローすると、サーバーはそれに従います。
それでは、多分あなたは:
try
{
MyEvent(this, EventArgs.Empty);
}
catch
{
}
しかし、複数のサブスクライバーがあり、1 つのサブスクライバーが例外をスローした場合、他のサブスクライバーはどうなりますか?
そのために、null チェックを実行し、サブスクライバー側からの例外を飲み込む静的ヘルパー メソッドをいくつか使用してきました (これは idesign によるものです)。
// Usage
EventHelper.Fire(MyEvent, this, EventArgs.Empty);
public static void Fire(EventHandler del, object sender, EventArgs e)
{
UnsafeFire(del, sender, e);
}
private static void UnsafeFire(Delegate del, params object[] args)
{
if (del == null)
{
return;
}
Delegate[] delegates = del.GetInvocationList();
foreach (Delegate sink in delegates)
{
try
{
sink.DynamicInvoke(args);
}
catch
{ }
}
}