tengo una clase Singleton similar a este C# Singleton seguro para subprocesos
public class Singleton
{
private static Singleton m_instance;
private Timer m_timer;
private static List<CustomObject> m_cacheObjects;
private Singleton()
{
m_cacheObjects = new List<CustomObject>();
m_timer= new Timer(MyTimerCallBack,
null,
TimeSpan.FromSeconds(60),
TimeSpan.FromSeconds(60));
}
public static Singleton Instance
{
get
{
if (m_instance == null)
{
m_instance = new Singleton();
}
return m_instance;
}
}
private void MyTimerCallBack(object state)
{
//******** Update the list by interval here ******************
m_cacheObjects = UpdateTheList();
}
public void CallMe()
{
foreach (CustomObject obj in m_cacheObjects)
{
// do something here based on obj
// The question is, does the m_cacheObjects is thread safe??
// what happen if the m_cacheObjects is changed
// during the loop interation?
}
}
}
El método CallMe
será llamado por servicio web:[WebMethod]
public void CallMeWebService()
{
Singleton.Instance.CallMe();
}
Las preguntas: 1) es el m_cacheObjects es hilo ¿seguro? ¿Qué ocurre si se cambia m_cacheObjects (debido al temporizador) durante la interacción del bucle (en CallMe())?
2) ¿Se creará un nuevo subproceso cuando se llame al servicio web CallMeWebService()?
1) a) No, 1) b) No puede estar seguro, 2) Sí – Jodrell
Seguiré las respuestas a continuación para hacer que la inicialización estática sea segura para subprocesos. – user1553857
Ahora me preocupa más la lista estática m_cacheObjects. Pausa implícitamente (modo de depuración) en el ciclo foreach y espero a que el temporizador marque y cambie la lista m_cacheObjects, suponiendo que el ciclo foreach fallará debido a la modificación de la lista, pero continuará repitiendo sin excepción. ¿Esto es normal? – user1553857