2012-05-03 2 views
1

Parallel.ForEach에 사용할 수있는 finally이 있는지 알고 싶습니다.Parallel.ForEach finally 절

try 
{ 
} 
finally 
{ 
} 

Parallel.ForEach에서 가능한가요?

루프가 완료되면 마침내해야합니다.

Parallel.ForEach(someList, x => 
{ 
    //... 
}, // Now i need to do a finally); 

내 문제는 내가 내 Parallel.ForEach 주위에 마지막 시도를해야한다는 것입니다,하지만 난 결국 일이 돼요. 병렬 작업이 완료 될 때만 발생해야합니다.

그래서 이것은 나를 위해 작동하지 않습니다 :

try 
{ 
    Parallel.ForEach(someList, x => 
    { 
     //... 
    }); 
} 
finally 
{ 
} 

어쩌면이 일을 다른 방법이 있나요?

답변

5

루프 및 finally은 함께 사용하지 않습니다 (Python 제외). 루프 뒤에서 실행되도록 코드를 작성하면된다.

에 관계없이 루프에서 예외를 실행하려면이 이런 식으로 작업을 수행합니다

try 
{ 
    Parallel.ForEach(...) 
} 
finally 
{ 
    // ... 
} 

초 생각에, 어쩌면 영업, 표준은 제공 할 수 있습니다이 Parallel.ForEach overload를 사용하는 루프의 반복을 한 번 더 실행하는 데 사용 된 스레드가 완료 될 때마다 호출되는 "localFinal"액션입니다.

+0

약간의 설명으로,이 작동하는 이유는 'Parallel.ForEach'가 모든 작업이 완료 될 때까지 (예 : 스레드를 시작하는 것과는 달리) 제어를 즉시 반환하는 현재 스레드를 차단한다는 것입니다. –

+0

내 업데이트를 확인하십시오. – Willem

+0

미안하지만, "나는 마침내 일어나기를 원하지 않는다"또는 "작업이 완료 될 때"에 의해 당신이 의미하는 것이 상당히 명확하지 않습니다. (1) 마침내 원한다면 쓰지 마라. (2)'Parallel' 클래스를 사용하여'Task' 클래스에서 추상화합니다 (실제로 그 클래스를 참조한다고 가정). –

2

당신 중 액션 내부의 try .. finally 블록이 병렬로 수행하거나 외부되고 넣어 :

Parallel.ForEach(someList, x => 
{ 
    try 
    { 
    } 
    finally 
    { 
    } 
}); 

또는 :

그것은 분명하지 않다 사용 사례에 따라 달라
try 
{ 
    Parallel.ForEach(someList, x => 
    { 
    }); 
} 
finally 
{ 
} 

질문에서.

+0

내 업데이트를 확인하십시오. – Willem

+0

그런 경우, 후자의 경우가 효과적입니다. Christian S의 대답에 대한 Tim S의 코멘트를보십시오. –