난 당신이 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 });
당신은 foreach는 블록 내부 작업을 기다리고 및 WhenAny와 함께 작업 기다릴 수는 HTTPS에 표시됩니다 좋아 : // 유래. co.kr/questions/4238345/asynchronousously-wait-for-taskt-to-complete-with-timeout을 참조하십시오. – blit
'파일을 건너 뛰고 다음 파일로 이동하고 싶습니다. '-이 문장은 혼란 스럽습니다. Parallel.ForEach는 한 번에 하나씩이 아니라 병렬로 목록의 모든 파일을 처리합니다. 특정 파일 처리를 중단하기로 결정하면 그만하면됩니다. 다른 사람들은 계속해서 갈 것입니다. –