Angenommen, ich habe eine Liste in einer Klasse, die in einem Multithreading-Szenario verwendet wird.Auflisten einer Liste in einer thread-sicheren Weise
public class MyClass
{
List<MyItem> _list= new List<MyItem>();
protected object SyncRoot {
get {
return ((IList)_list).SyncRoot;
}
}
public void Execute1()
{
lock(SyncRoot)
{
foreach(var item in _list) DoSomething(item);
}
}
public void Execute2()
{
Item[] list;
lock(SyncRoot)
{
list=_list.ToArray();
}
for(var i=0;i<list.Length;i++) DoSomething(list[i]);
}
}
Verfahren EXECUTE1 ist die 'normale' Weg, um die Liste in eine Thread-sichere Weise aufzuzählen. Aber was ist mit Execute2? Ist dieser Ansatz noch Thread-sicher?
Nein, Execute2 ist nicht sicher, wenn MyItems Referenztypen (Objekte) sind, da die Liste und das Array letztendlich auf dieselben Objekte verweisen. – Will
@Will Das ist in diesem speziellen Szenario kein Problem, da ich mich nur um die Liste selbst kümmere. Die Objekte können sich selbst synchronisieren, wenn dies erforderlich ist. – MikeSW
@HenkHolterman Ich weiß, dass ich jedes Objekt verwenden kann, aber ich frage mich, ob es besser ist, das Sync-Objekt der Liste zu verwenden. Ich meine, deshalb ist es ausgesetzt, nein ?! – MikeSW