L'implementazione è sotto thread-safe? Se no, cosa mi sto perdendo? Devo avere le parole chiave volatile
da qualche parte? O un blocco da qualche parte nel metodo OnProcessingCompleted
? Se sì, dove?C#: eventi thread-safe
public abstract class ProcessBase : IProcess
{
private readonly object completedEventLock = new object();
private event EventHandler<ProcessCompletedEventArgs> ProcessCompleted;
event EventHandler<ProcessCompletedEventArgs> IProcess.ProcessCompleted
{
add
{
lock (completedEventLock)
ProcessCompleted += value;
}
remove
{
lock (completedEventLock)
ProcessCompleted -= value;
}
}
protected void OnProcessingCompleted(ProcessCompletedEventArgs e)
{
EventHandler<ProcessCompletedEventArgs> handler = ProcessCompleted;
if (handler != null)
handler(this, e);
}
}
Nota: Il motivo per cui ho evento privato e roba interfaccia esplicita, è perché è una classe base astratta. E le classi che ne ereditano non dovrebbero fare nulla direttamente con quell'evento. Aggiunta l'involucro di classe in modo che sia più chiaro =)
(risposto al commento) –