Dlaczego poniższy kod jest wykonywany sekwencyjnie?Dlaczego te zadania są uruchamiane sekwencyjnie?
List<Task> tasks = new List<Task>();
for (int i = 0; i <= max; i += block)
{
if (i + block >= max)
tasks.Add(Task.Factory.StartNew(() => Count(ref counter, block)));
else
block = max - i;
}
Task.WaitAll(tasks.ToArray());
Przetestowałem również wersję tego przy użyciu Parallel.Invoke
; ono również nie działa równolegle. Musi być coś, czego nie rozumiem, ale kiedy próbuję tego używać, najczęściej otrzymuję instrukcje, jak wymusić sekwencyjne wykonanie.
W odpowiedzi na jedno z zastrzeżeniami podanymi w poniższej odpowiedzi, mam włączone następujące metody dla odniesienia:
static void Count(ref int counter, int num)
{
int localCounter = 0;
for (int i = 0; i < num; i++)
if (Coin()) localCounter++;
System.Threading.Interlocked.Add(ref counter, localCounter);
}
redakcją ponownie: Dziękuję wszystkim!
Ile masz procesorów/rdzeni? –
Jak szybkie jest 'Count'? –
Jaki masz dowód na to, że nie jest on porównywany? Problemem może być obserwacja tego, co się dzieje, a nie to, co się dzieje. – Servy