It would be safe, however, just to know that this is not a guarantee that the code in SomeEventHandler will be executed only once. A race condition may occur if you have a multi-threaded code.
Edit : Unsubscribing from an event, behind the scenes, brings together delegates to create a list of delegates. (Detailed information can be found on this article by John Skeet, the man himself )
Note that the event uses locks to ensure thread safety in conjunction with a delegate. After combining the delegate with your event, you will receive a list of delegates. However, when you raise an event, it is not guaranteed that the latest version of the combined delegates will be used. (see Thread-safe events), but this is not due to the fact that the event was disabled from within the event.
I hope my editing will give enough explanation :)
Fabio salvalai
source share