2010-11-25 2 views
2

C#에서는 for 루프와 마찬가지로 순서가 없지만 여러 개가있는 for (...) System.Threading.Tasks.Parallel.For 스레드. 것은 long과 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, 동작 <ulong>)를 .NET Framework의 다음 버전에 추가하십시오. 즉 나올 때까지, 당신은 이런 식으로 뭔가에 의지해야합니다 :

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

예, 작동에 대한 사용자 지정 범위를 만들 수 있습니다,하지만 난 더 거기에 희망 우아한 버전 – phogl

+0

불행히도 Microsoft는 int 및 긴 버전의 Parallel.For() 만 제공합니다. ()에 대한 일반 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); 
}