普通、イベントハンドラを叩き起こす時は
public event EventHandler SomeEvent;
public void Raise(EventArgs e)
{
if (SomeEvent != null)
SomeEvent(this, e);
}
みたいにnullチェックをしてから投げるんですが、マルチスレッドなプログラムだと
nullチェックした後に最後のイベントハンドラが購読解除されていざInvokeするときにはnullになってることがあるので、厳密には
public event EventHandler SomeEvent;
public void Raise(EventArgs e)
{
var sev = SomeEvent;
if (sev != null)
sev(this, e);
}
とする必要があります。
ちなみにイベントハンドラは
public event EventHandler SomeEvent = (o, e) => {};
と定義しておくとクラス内でnullを代入しない限りnullチェックしなくて済むようになったり。