C # System.Threading.Tasks.Parallel.For su ulong
-
28-09-2019 - |
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);
}
Soluzione
Si può sempre scrivere a Microsoft e chiedere loro di aggiungere Parallel.For (ulong, ulong, Azione
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);
}