EventAggregator, действительно ли это ориентировано на многопотоковое исполнение?

Действительно ли это ориентировано на многопотоковое исполнение?

EventAggregator в Призме является очень простым классом только с одним методом. Я был удивлен, когда я заметил, что не было никакой блокировки вокруг пустой проверки и создания нового типа для добавления к частному _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;
    }
6
задан pfaz 14 May 2010 в 12:24
поделиться

3 ответа

Нет, не потокобезопасный.

  1. Доступ к члену экземпляра самого класса List НЕ потокобезопасен , согласно MSDN в разделе Безопасность потоков
  2. Сам метод не является потокобезопасным
    1. 2 потока могут войти в метод одновременно
    2. Оба пытаются получить FirstOrDefault
    3. Оба ничего не получают
    4. Оба добавляют новый TEventType

Я бы

  1. переключился на одну из коллекций System.CollectionConcurrentX в .NET 4
    http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx
    или
  2. выполните собственную блокировку
4
ответ дан 17 December 2019 в 07:01
поделиться

Ну, основываясь на этой вставке кода, я бы сказал, что нет, это не 100% потокобезопасно.

Конечно, у вас есть исходники, так что вы можете просто добавить блокировку самостоятельно. :)

Вообще-то, как правило, я включаю весь проект CAL в свое решение, по крайней мере, в самом начале. Это очень помогает в отладке тех странных исключений регистрации/создания региона...

0
ответ дан 17 December 2019 в 07:01
поделиться

Это зависит от того, что такое "_events"...

В .NET 4 есть несколько потрясающих новых потокобезопасных классов ...
Проверьте http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx

0
ответ дан 17 December 2019 в 07:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: