probabilmente oltre al cambio di sistema operativo, stai eseguendo l'applicazione con un framework diverso, più o meno aggiornato rispetto all'altro pc dove il tutto funziona, non mi ricordo bene, ma avevo letto che in una qualche versione del framework avessero cambiato alcuni comportamenti con le variabili closure abbinate ai cicli o lambda function, ad ogni modo puoi verificare che stiano eseguendo lo stesso identico framework.
di seguito le istruzioni per capire che versione di framework stai utilizzando: http://msdn.microsoft.com/it-it/library/hh925568.aspx
in ogni caso il messaggio di errore è chiaro, tenti di modificare o leggere una collezione mentre quest'ultima è già stata modificata, il caso classico è:
void Main()
{
var list = new List<string>();
list.Add("ciao");
list.Add("mondo");
foreach (var element in list)
{
list.Remove(element);
}
}
oppure se stai eseguendo un operazione di modifica in un thread separato:
void Main()
{
var list = new List<string>();
list.Add("ciao");
list.Add("mondo");
var t = new Thread(() =>
{
Thread.Sleep(1000); // per fare sovrapporre questo thread all'esecuzione del foreach
list.Add("zzzzz");
});
t.Start();
foreach (var element in list)
{
Console.WriteLine(element);
Thread.Sleep(1000); // giusto per dare tempo all'altro thread di modificare la collezione
}
}
quindi ti consiglio comunque di rivedere il tuo codice, spesso questi problemi si risolvono semplicemente facendo una copia della collezione (la copia di una collezione di reference object è particolarmente veloce, perchè copia solo i riferimenti, quindi non preoccuparti di questa operazione):
void Main()
{
var list = new List<string>();
list.Add("ciao");
list.Add("mondo");
var t = new Thread(() =>
{
Thread.Sleep(1000); // per fare sovrapporre questo thread all'esecuzione del foreach
list.Add("zzzzz");
});
t.Start();
foreach (var element in list.ToList())
{
Console.WriteLine(element);
Thread.Sleep(1000); // giusto per dare tempo all'altro thread di modificare la collezione
}
}
come vedi è stato sufficiente aggiungere il .ToList() che implicitamente fa la copia del sotto array.
e anche l'altro esempio:
void Main()
{
var list = new List<string>();
list.Add("ciao");
list.Add("mondo");
foreach (var element in list.ToList())
{
list.Remove(element);
}
}
Ciao!
Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic