EventAggregator,它是线程安全的吗?

时间:2010-05-14 12:24:14

标签: wpf silverlight prism eventaggregator

这是线程安全吗?

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;
    }

3 个答案:

答案 0 :(得分:4)

不,不是线程安全的。

  1. 根据MSDN under Thread safety
  2. ,List类本身的实例成员访问非线程安全
  3. 方法本身不是线程安全的
    1. 2个线程可以同时进入该方法
    2. 两者都试图获得FirstOrDefault
    3. 两者都没有得到
    4. 两者都添加新的TEventType
  4. 我会

    1. 切换到.NET 4中的一个System.CollectionConcurrentX集合 http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx
    2. 自己锁定

答案 1 :(得分:0)

这取决于“_events”是什么......

.NET 4中有一些很棒的新线程安全类...
查看http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx

答案 2 :(得分:0)

嗯,根据代码粘贴,我会说不,它不是100%线程安全的。

当然,你有源,所以你可以自己添加锁。 :)

实际上,作为一般经验法则,我将整个CAL项目包含在我的解决方案中,至少在开始时。它有助于调试那些奇怪的区域注册/创建异常...