下面的实现是线程安全的吗?如果不是,我错过了什么?我应该在哪里使用
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);
}
}
注意: 我有私有事件和显式接口的原因是因为它是一个抽象基类。继承它的类不应该直接操作那个事件。添加类包装器使其更加清晰。
var handler = Interlocked.CompareExchange(ProcessCompleted, null, null);
这段代码会做什么? - bohdan_trotsenko