This came up on an internal alias, and I thought I should spread it around.

 

If you’re going to fire an event, you may have code like this:

 

      void F()

      {

            if (SomeEvent != null)

            {

                  SomeEvent();

            }

      }

 

There’s a race condition here.  If another thread removes the last handler between the if() and the call, then it’ll crash.

 

The safe way is to use the copy-and-test pattern:

 

      void FireSomeEvent()

      {

            D temp = SomeEvent;

            if (temp != null)

            {

                  temp();

            }

      }