Domanda

In C #, ce n'è una System.Threading.Tasks.Parallel.For (...) Quale fa lo stesso di un ciclo for, senza ordine, ma in più thread. Il fatto è che funziona solo su lungo e int, voglio lavorare con ulong. Va bene, posso typecast ma ho qualche problema con i confini. diciamo di Let, voglio un anello da long.MaxValue-10 a long.MaxValue + 10 (ricordo, sto parlando ulong) ... come posso fare questo? (Devo ammettere, mi sento un po 'stupido in questo momento, ma non riesco proprio a capirlo in questo momento)

Un esempio:

for (long i = long.MaxValue - 10; i < long.MaxValue; ++i)
{
    Console.WriteLine(i);
}
//does the same as
System.Threading.Tasks.Parallel.For(long.MaxValue - 10, long.MaxValue, delegate(long i)
{
    Console.WriteLine(i);
});
//except for the order, but theres no equivalent for
long max = long.MaxValue;
for (ulong i = (ulong)max - 10; i < (ulong)max + 10; ++i)
{
    Console.WriteLine(i);
}
È stato utile?

Soluzione

Si può sempre scrivere a Microsoft e chiedere loro di aggiungere Parallel.For (ulong, ulong, Azione ) per la prossima versione del .NET Framework. Fino a che esce, si dovrà ricorrere a qualcosa di simile:

Parallel.For(-10L, 10L, x => { var index = long.MaxValue + (ulong) x; });

Altri suggerimenti

In alternativa, è possibile creare un intervallo personalizzato per Parallel.ForEach

public static IEnumerable<ulong> Range(ulong fromInclusive, ulong toExclusive)
{
  for (var i = fromInclusive; i < toExclusive; i++) yield return i;
}

public static void ParallelFor(ulong fromInclusive, ulong toExclusive, Action<ulong> body)
{
  Parallel.ForEach(
     Range(fromInclusive, toExclusive),
     new ParallelOptions { MaxDegreeOfParallelism = 4 },
     body);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top