C # System.Threading.Tasks.Parallel.For на ulong - PullRequest
2 голосов
/ 25 ноября 2010

В C # есть System.Threading.Tasks.Parallel.For (...), который делает то же самое, что и цикл for, без порядка, но в нескольких потоках.Дело в том, что он работает только на long и int, я хочу работать с ulong.Ладно, я могу набрать, но у меня есть проблемы с границами.Допустим, я хочу цикл от long.MaxValue-10 до long.MaxValue + 10 (помните, я говорю об ulong) ... как мне это сделать?(Должен признать, сейчас я чувствую себя немного глупо, но я просто не могу понять это прямо сейчас)

Пример:

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);
}

Ответы [ 2 ]

3 голосов
/ 25 ноября 2010

Вы всегда можете написать в Microsoft и попросить их добавить Parallel.For (ulong, ulong, Action ) в следующую версию .NET Framework. Пока это не выйдет, вам придется прибегнуть к чему-то вроде этого:

Parallel.For(-10L, 10L, x => { var index = long.MaxValue + (ulong) x; });
0 голосов
/ 09 июня 2015

Или вы можете создать пользовательский диапазон для 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);
}
...