Действительно ли это ориентировано на многопотоковое исполнение?
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;
}
Нет, не потокобезопасный.
Я бы
Ну, основываясь на этой вставке кода, я бы сказал, что нет, это не 100% потокобезопасно.
Конечно, у вас есть исходники, так что вы можете просто добавить блокировку самостоятельно. :)
Вообще-то, как правило, я включаю весь проект CAL в свое решение, по крайней мере, в самом начале. Это очень помогает в отладке тех странных исключений регистрации/создания региона...
Это зависит от того, что такое "_events"...
В .NET 4 есть несколько потрясающих новых потокобезопасных классов ...
Проверьте http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx