Ho un ciclo Parallel.ForEach() che prende un elenco di URL e li scarica ciascuno per qualche ulteriore elaborazione. Al di fuori del mio ciclo ho dichiarato una variabile del contatore del ciclo e all'interno del corpo del ciclo io uso Interlocked.Increment() pensando che questo sarebbe il modo migliore per mantenere un modo "thread safe" di aumentare il conteggio quando viene eseguita ciascuna interazione del ciclo.Interlocked.Increment() non funziona come mi aspetto nella Task Parallel Library
int counter = 0;
Parallel.ForEach(urlList, (url, state) =>
{
// various code statments
Interlocked.Increment(ref counter);
Debug.WriteLine(" ......... counter: " + counter);
});
avrei pensato che avrei visto qualcosa di simile a:
......... 1
......... 2
......... 3
......... 4
......... 5
.........
.........
......... n
Ma quello che ottengo è invece 16 "......... 0" (questo è perché io avere un computer quad-core doppio con 8 core nativi, ma l'hyper-threading è abilitato e mi dà un totale di 16 core). Quindi inizierò a vedere il contatore incrementato normalmente per la maggior parte, ma a volte vedrò dei valori contatore duplicati o anche triplicati nell'output Debug.
Utilizzo di Parallel.ForEach() qual è il modo migliore per contare le iterazioni del ciclo? Grazie per qualsiasi consiglio.
I valori duplicati sono previsti. Ma non capisco da dove vengono gli 0. – CodesInChaos
Un work around sta usando int 'myCounter = Interloced.Increment (contatore ref); Debug.WriteLine (myCounter); ' – CodesInChaos
Puoi pubblicare del codice che in realtà compila ed espone il problema (cioè stampe 0s)? – CodesInChaos