这是线程安全吗?
Prism中的EventAggregator是一个非常简单的类,只有一个方法。当我注意到null检查没有锁定并创建一个新类型以添加到private _events集合时,我感到很惊讶。如果两个线程同时为同一类型调用GetEvent(在_events中存在之前),则看起来这会导致集合中有两个条目。
/// <summary>
/// Gets the single instance of the event managed by this EventAggregator. Multiple calls to this method with the same <typeparamref name="TEventType"/> returns the same event instance.
/// </summary>
/// <typeparam name="TEventType">The type of event to get. This must inherit from <see cref="EventBase"/>.</typeparam>
/// <returns>A singleton instance of an event object of type <typeparamref name="TEventType"/>.</returns>
public TEventType GetEvent<TEventType>() where TEventType : EventBase
{
TEventType eventInstance = _events.FirstOrDefault(evt => evt.GetType() == typeof(TEventType)) as TEventType;
if (eventInstance == null)
{
eventInstance = Activator.CreateInstance<TEventType>();
_events.Add(eventInstance);
}
return eventInstance;
}
答案 0 :(得分:4)
不,不是线程安全的。
我会
答案 1 :(得分:0)
这取决于“_events”是什么......
.NET 4中有一些很棒的新线程安全类...
查看http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx
答案 2 :(得分:0)
嗯,根据代码粘贴,我会说不,它不是100%线程安全的。
当然,你有源,所以你可以自己添加锁。 :)
实际上,作为一般经验法则,我将整个CAL项目包含在我的解决方案中,至少在开始时。它有助于调试那些奇怪的区域注册/创建异常...