0

파일을 처리하고 각 파일에 대해 병렬로 일부 작업을 수행하는 Parallel.Foreach 코드가 있습니다.Parallel.Foreach 안에 스레드가 걸린 시간을 확인하고 더 많은 시간이 걸리면 종료하십시오.

Parallel.ForEach(lstFiles, file=> 
{ 
// Doing some operation on file 
// Skip file and move to next if it is taking too long 
}); 

나는 파일을 건너 뛰고 다음 파일 로 이동합니다 (그러나 Parallel.Foreach을 종료하지 않음) 특정 파일이 (2 분 말)이 너무 오래 걸리는 경우을. Parallel.Foreach에서 스레드가 단일 파일을 처리하는 데 걸린 시간을 확인하는 방법이 있습니까?

감사

+0

당신은 foreach는 블록 내부 작업을 기다리고 및 WhenAny와 함께 작업 기다릴 수는 HTTPS에 표시됩니다 좋아 : // 유래. co.kr/questions/4238345/asynchronousously-wait-for-taskt-to-complete-with-timeout을 참조하십시오. – blit

+2

'파일을 건너 뛰고 다음 파일로 이동하고 싶습니다. '-이 문장은 혼란 스럽습니다. Parallel.ForEach는 한 번에 하나씩이 아니라 병렬로 목록의 모든 파일을 처리합니다. 특정 파일 처리를 중단하기로 결정하면 그만하면됩니다. 다른 사람들은 계속해서 갈 것입니다. –

답변

1

난 당신이 Parallel.ForEach를 사용하는 대신 Mirosoft의 매우 강력한 반응성 프레임 워크를 사용하지 않는 게 좋을 것. 그러면 다음 작업을 수행 할 수 있습니다.

var query = 
    from file in lstFiles.ToObservable() 
    from result in Observable.Amb(
     Observable.Start(() => SomeOperation(file)).Select(_ => true), 
     Observable.Timer(TimeSpan.FromMinutes(2.0)).Select(_ => false)) 
    select new { file, result }; 

IDisposable subscription = 
    query 
     .Subscribe(x => 
     { 
      /* do something with each `new { file, result }` 
       as they arrive. */ 
     }, ex => 
     { 
      /* do something if an error is encountered */ 
      /* (stops processing on first error) */ 
     },() => 
     { 
      /* do something if they have all finished successfully */ 
     }) 

이것은 모두 병렬로 수행됩니다. Observable.Amb 연산자는 인수 목록에 정의 된 두 개의 관측 값을 시작하고 그 중 두 값 중에서 먼저 값을 생성하는 값을 취합니다. 즉, Start 관측 가능 파일이며 파일이 처리 된 경우 Timer이 표시되면 2.0 분이 경과 한 후 파일의 결과.

중도에있을 때 처리를 중지하려면 subscription.Dispose()으로 전화하십시오.

NuGet "System.Reactive"를 사용하여 비트를 가져옵니다.


주석의 요청에 따라 람다 형태의 쿼리

:

var query = 
    lstFiles 
     .ToObservable() 
     .SelectMany(
      file => 
       Observable.Amb(
        Observable.Start(() => SomeOperation(file)).Select(_ => true), 
        Observable.Timer(TimeSpan.FromMinutes(2.0)).Select(_ => false)), 
      (file, result) => new { file, result }); 
+0

람다 형식의 lstFiles.ToObservable() 파일에서 linq 쿼리 "var query = "을 추가 할 수도 있습니까? – Gerry

+0

@Gerry - 쿼리에 람다 양식을 추가했습니다. – Enigmativity

+0

고맙습니다. @Enigmativity. – Gerry