ich eine Singletonklasse haben ähnlich wie dieseC# Singleton Faden sicher
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?
}
}
}
CallMe Methode wird durch Web-Service aufgerufen werden 1) Ist die m_cacheObjects Thread sicher? Was passiert, wenn die m_cacheObjects während der Loop-Integration (in der CallMe()) (wegen des Timers) geändert wird?
2) Wird ein neuer Thread erstellt, wenn der Webservice CallMeWebService() aufgerufen wird?
1) a) Nein, 1) b) Sie können nicht sicher sein, 2) Ja – Jodrell
Ich werde die folgenden Antworten folgen, um die statische Initialisierung threadsicher zu machen. – user1553857
Jetzt interessiere ich mich mehr für die statische Liste m_cacheObjects. Ich pausiere implizit (Debug-Modus) in der foreach-Schleife und warte darauf, dass der Timer tickt und die m_cacheObjects-Liste ändert, vermutlich schlägt die foreach-Schleife aufgrund der Änderung der Liste fehl, aber sie läuft ohne Ausnahme weiter. Ist das normal? – user1553857