Poniższy kod wyjaśnia moje pytanie. Wiem, że lista nie jest bezpieczna dla wątków. Ale jaki jest podstawowy "prawdziwy" powód tego?wiele wątków dodających elementy do jednej listy. dlaczego zawsze na liście jest mniej przedmiotów niż się spodziewano?
class Program
{
static void Main(string[] args)
{
List<string> strCol = new List<string>();
for (int i = 0; i < 10; i++)
{
int id = i;
Task.Factory.StartNew(() =>
{
AddElements(strCol);
}).ContinueWith((t) => { WriteCount(strCol, id.ToString()); });
}
Console.ReadLine();
}
private static void WriteCount(List<string> strCol, string id)
{
Console.WriteLine(string.Format("Task {0} is done. Count: {1}. Thread ID: {2}", id, strCol.Count, Thread.CurrentThread.ManagedThreadId));
}
private static void AddElements(List<string> strCol)
{
for (int i = 0; i < 20000; i++)
{
strCol.Add(i.ToString());
}
}
}
Wygląda na to, że niektóre wątki piszą o sobie nawzajem. Wewnętrzna lista musi wykorzystywać licznik do zwiększenia do następnej pozycji, a ponieważ nie jest bezpieczna dla wątków, jej wartości nadpisujące są podane jako –