4

C#にSystem.Threading.Tasks.Parallel.For(...)は、ループと同じようforに順序なしで実行するが、複数のスレッドで実行されるaがあります。事は、それはでしか動作しないということです、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);
}
4

3 に答える 3

5

いつでもMicrosoftに書き込み、Parallel.For(ulong、ulong、Action <ulong>)を次のバージョンの.NETFrameworkに追加するように依頼できます。それが出るまで、あなたはこのようなものに頼らなければならないでしょう:

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 に答える