Il seguente codice spiega la mia domanda. So che l'elenco non è thread-safe. Ma qual è la sottostante "vera" ragione di ciò?più thread che aggiungono elementi a una lista. perché ci sono sempre meno articoli nella lista del previsto?
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());
}
}
}
sembra che alcuni dei fili si scrivano uno sull'altro. L'elenco interno deve utilizzare un contatore per passare alla posizione successiva e, poiché non è protetto da thread, i suoi valori di sovrascrittura –