2010-05-14 21 views
6

¿Es esto seguro para subprocesos?EventAggregator, ¿es seguro para subprocesos?

El EventAggregator en Prisma es una clase muy simple, con un solo método. Me sorprendió cuando noté que no había ningún bloqueo alrededor de la verificación nula y la creación de un nuevo tipo para agregar a la colección privada _events. Si dos subprocesos llamados GetEvent simultáneamente para el mismo tipo (antes de que exista en _events) parece que esto daría como resultado dos entradas en la colección.

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

Respuesta

4

No, no es seguro para subprocesos.

  1. El ejemplo del acceso de miembros de la clase Lista sí son NO hilo seguro, como por MSDN under Thread safety
  2. El método no es hilo de seguridad
    1. 2 hilos podían entrar en el método al mismo tiempo
    2. Ambos tratan de conseguir el FirstOrDefault
    3. Ambos reciben nada
    4. Tanto añadir un nuevo TEventType

lo haría

  1. interruptor en una de las colecciones System.CollectionConcurrentX en .NET 4
    http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx
    o
  2. haga su propio bloqueo
+0

+1 @ Peter De acuerdo. Vine aquí para comprobar la cordura después de tener algunos problemas y luego mirar el código de EventAggregator en el reflector. No puedo creer que no lo hicieron seguro para subprocesos dado el uso arquitectónico previsto. De todos modos, me sorprendió. –

+0

@chibacity yo también, sorprendido de que estuviera ;-) –

0

Bueno, a partir de ese código pega, diría que no, no es 100% seguro para subprocesos.

Por supuesto, usted tiene la fuente, lo que sólo puede añadir el bloqueo de uno mismo. :)

En realidad, como regla general, que incluyen todo el proyecto CAL en mi solución, al menos al principio. Ayuda mucho en la depuración de las excepciones de registro/creación región impares ...

Cuestiones relacionadas