4

在 C# 中,有一个与循环System.Threading.Tasks.Parallel.For(...)相同的for循环,没有顺序,但在多个线程中。问题是,它仅适用于longand int,我想使用ulong. 好的,我可以进行类型转换,但我在边界方面遇到了一些问题。

比方说,我想要一个从long.MaxValue-10to的循环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);
}
4

3 回答 3

5

您可以随时写信给 Microsoft 并要求他们将 Parallel.For(ulong, ulong, Action<ulong>) 添加到 .NET Framework 的下一个版本。在出现之前,您将不得不求助于这样的事情:

Parallel.For(-10L, 10L, x => { var index = long.MaxValue + (ulong) x; });
于 2010-11-25T18:59:08.440 回答
2

或者您可以为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);
}
于 2015-06-09T14:04:40.183 回答
0

这适用于从包容性到独占性的每一个long价值long.MinValuelong.MaxValue

Parallel.For(long.MinValue, long.MaxValue, x =>
{
    ulong u = (ulong)(x + (-(long.MinValue + 1))) + 1;
    Console.WriteLine(u);
});
于 2022-02-25T22:32:56.053 回答