Ist die Implementierung unter Thread-sicher? Wenn nicht, was fehlt mir? Sollte ich irgendwo die volatile
Schlüsselwörter haben? Oder ein Schloss irgendwo in der OnProcessingCompleted
Methode? Wenn ja, wo?C#: Thread-sichere Ereignisse
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);
}
}
Hinweis: Der Grund, warum ich private Veranstaltung und explizite Schnittstelle Zeug haben, ist, weil es eine abstrakte Basisklasse ist. Und die Klassen, die davon erben, sollten nichts direkt mit diesem Ereignis tun. Hinzugefügt Wrapper die Klasse, so dass es klar ist =)
(auf Kommentar geantwortet) –