2010-11-25 7 views
2

C#では、forループと同じ、順序なしで、複数のスレッド。 事は、それは長いとintでのみ動作し、私はulongで動作したいです。さて、私は型キャストすることができますが、私は国境にいくつかの問題があります。私はlongからMaxValue-10までのループを必要としているとしましょう.MaxValue + 10(覚えておいて、私はulongについて話しています)...どうすればいいですか? (私は認めなければならない、私は今少し愚かな感じが、私はちょうど今、それを把握することはできません)C#System.Threading.Tasks.Parallel.For on 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); 
} 

答えて

3

あなたはいつもマイクロソフトに書き、それらを求めることができますParallel.For(ulong、ulong、Action <ulong>)を.NET Frameworkの次のバージョンに追加します。それが出てくるまでは、このような何かに頼る必要があります:

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

はい、働くためのカスタム範囲を作成することができますが、私はより多くのがあった望みましたエレガントなバージョン – phogl

+0

残念ながら、MicrosoftはParallel.For()のintとlongバージョンのみを提供しています。 ()の汎用Parallelはありません。ここで、Tは範囲変数です。 ulongをサポートするには、ソースコードを変更するか、Parallel.For()の独自の実装を記述する必要があります。 –

+0

私はそれがparallel.forの独自の実装になると思いますが、それは効率的ではないと恐れています。 – phogl

0

それとも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); 
}