2011-04-14 4 views
2

일련의 메서드 호출을 포함하는 메서드가 있습니다. 이러한 메서드 호출 중 일부는 한 번에 발생할 수 있으며 일부는 순차적으로 수행해야합니다. 작업 병렬 라이브러리에서이를 구현하는 가장 직접적인 방법은 무엇입니까? 모든 기능은 계산이 무거워서 실행하는 데 1 초도 채 걸리지 않습니다. 즉 일부 병렬 작업과 일부 연속 작업이있는 메서드에 대한 작업 병렬 라이브러리

public object MyMethod(InputClass myInput) 
{ 
    var result = method1(myInput); 
    var result1 = method2(result); 
    var result2 = method3(result); 
    var finalResult = method4(result1, result2); 
    return finalResult; 
} 

방법 항목이 실행되어야 1, 방법 2 +의 Method3 병렬로 실행될 수 method4 최후 실행되어야한다.

답변

2

나는 이것이 당신이 요구하는 병렬 처리 수준을 제공 할 것이고, 방법 2와 3은 동시에 실행될 것이라고 믿습니다.

public void MyMethod(InputClass myInput) 
{ 
    TaskFactory<object> t = new TaskFactory<object>(); 

    var result = method1(myInput); // Execute Synchronously 

    Task<object> t1 = t.StartNew(method2, result); // Create and start new concurrent task 
    Task<object> t2 = t.StartNew(method3, result); // Create and start new concurrent task 

    t1.Wait(); //Wait for completion 
    t2.Wait(); //Wait for completion 

    var finalResult = method4(t1.Result, t2.Result); // Execute Synchronously 
} 

편집 : 업데이트 몇 가지 유형, 가정의 모든 방법은 object을 반환합니다.

4

ContinueWith를 사용하여 아래와 같이 순차 실행을 지정할 수 있습니다.

TaskFactory myFactory = new TaskFactory(); 

myFactory.StartNew(method).ContinueWith(delegate 
{ 
    Task t1 = myFactory.StartNew(method2); 
    Task t2 = myFactory.StartNew(method3); 

    myFactory.ContinueWhenAll(new [] {t1, t2}, method4); 
}); 
+0

무엇이 달성할까요? 확실히 이것은 모든 메소드를 순서대로 실행합니다. – trickdev

+0

미안하지만, 안쪽 부분을 잊어 버렸습니다. 나는 다시 편집했다. – ertan

+0

이 코드는 연속 전달 스타일로 작성됩니다. 비동기 블록은 문제를 생각할 때와 같은 순서로 코드가 흐르게합니다. 컴파일러가 CPS 변환을 수행합니다. – GregC

1

F #의 비동기 블록과 새로운 비동기 CTP는 이러한 문제를 깨끗하고 효과적으로 해결하여 동시 파이프 라인의 외부 구성을 허용하도록 설계되었습니다. 네가 TPL을 말한 건 알지만, 네가 한 번 봐봐.

async { 
    let! result = method1 myInput 
    let! result1 = method2 result 
    let! result2 = method3 result 
    let! finalResult = method4 result1 result2 
} 
+0

이것은 완전히 주제가 아닙니다 ...하지만 지난 2 년 동안 C#에서 시뮬레이션 프로그램을 작성해 보았습니다. 이전의 '언어'와 비교하여 (주로 Matlab) 나는 훨씬 더 행복한 장소에 왔습니다. 내가 F #을 고려하는 이유는 사람들이 계속해서 가져오고 아직 그 이점을 이해하지 못했기 때문입니다. 조금 실마리를 줄 수 있니? – PlTaylor

+1

Brian의 코멘트를 참조하십시오 : http://stackoverflow.com/questions/2444676/understanding-f-asynchronous-programming – GregC

+0

MatLab 우주에서 오는 경우, 과학적 컴퓨팅을 위해 제작 되었기 때문에 F #을 좋아할 것입니다. 나는 또한 책을 추천하고 싶다. http://www.amazon.com/F-Scientists-Jon-Harrop/dp/0470242116/ref=sr_1_1?ie=UTF8&s=books&qid=1302805276&sr=8-1 – GregC

관련 문제