Является ли реализация ниже потокобезопасной? Если нет, чего я не хватает? Должен ли я иметь ключевые слова volatile
где-то? Или замок где-нибудь в методе OnProcessingCompleted
? Если да, то где?
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);
}
}
Примечание. Причина, по которой у меня есть частное событие и явный материал интерфейса, объясняется тем, что это абстрактный базовый класс. И классы, которые наследуют от него, не должны делать ничего с этим событием напрямую. Добавлена оболочка класса, чтобы было более ясно =)