There is no need for the private ProcessCompleted
member to be an event
- it could just be a field: private EventHandler<ProcessCompletedEventArgs> ProcessCompleted;
- inside the class it always goes straight to the field, so the event
stuff is lost anyway.
The approach you've shown with an explicit lock object isn't much more thread-safe than just having a field-like event (i.e. public event EventHandler<ProcessCompletedEventArgs> ProcessCompleted;
- the only difference is that you aren't locking "this" (which is a good thing - you should ideally avoid locking on this
).. The "handler variable" approach is the right one, but there are still side-effects you should be aware of.