1

이 시나리오에 적합한 패턴을 찾고 있습니다.병렬 실행 체인 연결 명령

이런 방식으로 HDD의 프로세스 파일이 필요합니다.

  1. 로드 파일
  2. 이 결과를
  3. 가져 오기 파일을 분석을 기반으로 파일을
  4. 검증 파일을 분석하여 향후 변화 될 수 있습니다 검증 결과

이 프로세스를 기반으로 앱.

제 아이디어는 각 파일 작업 (명령 패턴)에 대한 create 명령입니다.

  • LoadFileCommand는 :
  • AnalyzeFileCommand IFileCommand : IFileCommand를
  • ValidateFileCommand : IFileCommand
  • ImportFileCommand : IFileCommand

코드 :

public interface IFileCommand 
{ 
    FileCommandResult Execute(); 
    void Abort(); 
} 
public class FileCommandResult 
{ 
    FileInfo File{get;} 
    bool Sucesss{get;} 
    string Error{get;} 
} 

내가 명령으로 프로세스를 생성해야합니다 s (명령이있는 체인).

나는이 목적으로 사용하려고 시도한다. 패턴의 체인이 좋지만 아마도 더 좋은 패턴이나 디자인이있을 수 있습니다.

가능하다면 Rx를 사용하고 병렬 실행도 좋을 것입니다.

나는이를 싶습니다

var data = new List<FileInfo>(); 

var process = new List<IFileCommand>{new LoadFileCommand(), new AnalyzeFileCommand(), new ValidateFileCommand(), new ImportFileCommand()}; 

var processor = new FileProcessor(); 

IEnumerable<IFileCommandResult> results = processor.Execute(process, data); 

어떤 아이디어.

+0

학교용입니까? 그냥 궁금해서. 내 대답보기 : http://stackoverflow.com/questions/27671917/how-to-use-yield-to-return-the-collection-of-item-in-parallel-block-or-task –

+0

@DaveSexton : 학교 문제가 아닙니다. 당신의 대답은 스트림을 통해 파일을 읽는 것입니다. 내 주요 문제는 명령을 연결하고 프로세스를 만드는 방법입니다. –

+0

왜 나는 명령을 왜 필요로하는지 궁금합니다. –

답변

0

왜 Rx를 사용 하시겠습니까? 작업을 일련의 명령으로 나타내려면 LINQ를 사용하여 명령 체인을 적용하면됩니다. 병렬로 실행하려면 PLINQ, TPL 또는 Parallel.ForEach를 사용하십시오. TPL Dataflow을 살펴볼 수도 있습니다.

다음은 문제를 해결하는 3 가지 방법입니다. 참고 오류 처리를 구현하지 않았거나 Abort 메서드를 사용하여 엉망이되어 사용하지 못 했으므로 Execute 메서드로 몇 가지 자유를했습니다. 이제 Execute에이 서명이 있다고 가정하고 FileInfo Execute(FileInfo)과 실패하면 예외를 throw합니다.

IEnumerable<FileInfo> data = ...; 
IEnumerable<IFileCommand> process = ...; 

// PLINQ 
var results = data 
    .AsParallel() 
    .Select(dataItem => process.Aggregate(dataItem, (d, p) => p.Execute(d))) 
    .ForAll(dataItem => import(dataItem)); 


// Parallel.Foreach 
Parallel.Foreach(data, dataItem => import(process.Aggregate(dataItem, (d, p) => p.Execute(d)))); 

// TPL 
var tasks = data 
    .Select(dataItem => Task.Run(() => import(process.Aggregate(dataItem, (d, p) => p.Execute(d))))); 
await Task.WhenAll(tasks); 
+0

파일에서 제대로 로딩하는 것은 비동기 작업입니다. LINQ를 사용하려고한다면 Rx를 사용하지 않고 금속에 가까이 두지 않으시겠습니까? 이것이 자동화 된 프로세스가 아니라면, 명령을 사용하는 것이 무엇인지 모르겠습니다. –

+0

@DaveSexton 예 명령이 비동기 작업으로 모델링 된 경우 Rx가 유용 할 수 있습니다. 아니면 아직도 TPL이나 데이터 흐름의 무리. 그러나 동기 명령을 사용하면 왜 Rx로 변환 할 가치가 있는지 알 수 없습니다. 스트레이트 Rx 또는 TPL 대신 명령의 유용한 측면 중 하나는 효과적으로 데이터이고 체인을 동적으로 조정할 수 있다는 것입니다. – Brandon