Estaba buscando un patrón para poder proporcionar una versión segura e insegura de subprocesos de la misma clase. Los aspectos técnicos de esto son bastante obvios. Supongo que estaba esperando a encontrar las convenciones de nombres/de acceso, etc ...¿Cuál es el beneficio de este .Net patrón
Así que descubro este patrón en todas partes del espacio de nombres '' Systems.Collections:
public class WhatEv
{
private class SyncWhatEv : WhatEv
{
// overrides IsSyncronized = true
// overrides whatever else to make it thread safe
}
public virtual bool IsSynchronized
{
get { return false; }
}
public static WhatEv Synchronized(WhatEv whatEv)
{
return new SyncWhatEv(whatEv);
}
}
Hay una serie de clases que implementan la siguiente: HashTable, Queue, ArrayList, Stack, etc ... Comprendo la herencia. Pero ¿por qué convertirlo en una clase privada anidada y hacer que el usuario salte a través de un aro para llegar a ella? ¿Hay algún beneficio al hacerlo de esta manera?
Gracias por su contribución hasta ahora. Solo estoy tratando de imaginar un escenario donde el usuario de este quiere recibir la clase base sin saber que es seguro para subprocesos. Si el receptor es un hilo, debería requerir la versión de hilo seguro, ¿verdad? si el receptor no lo es, ¿por qué le importaría? – TBone
Si va a acceder desde dos subprocesos, los dos necesitan estar usando la misma instancia sincronizada. No puede simplemente hacer que el receptor use una instancia sincronizada, y el hilo principal use la versión no sincronizada. Entonces, si hay alguna posibilidad de que otro subproceso acceda al objeto, debe estar sincronizado. Pero vea la respuesta de Joel para un posible problema. – CodeNaked
@Naked - De acuerdo. Pero SyncWhatEv hereda WhatEv. Por lo tanto, la misma instancia de SyncWhatEv podría utilizarse en el hilo principal como tipo WhatEv y requerida por el hilo de trabajo como tipo SyncWhatEv. Solo que esto no es posible porque SyncWhatEv es privado. Actualmente, el hilo debería verificar doblemente IsSynchronized y throw if false. – TBone