2017-05-21 3 views
0

현재 다른 작업을 수행 할 10 개의 새 스레드를 돌리는 엔진을 만들고 있습니다. 하지만 내 솔루션이 병렬로 실행되지 않는 것으로 나타났습니다.병렬 작업 사용

public async Task Start(Func<string, Task> action) 
{ 
    for (var i = 1; i <= config.threads; i++) 
    { 
     consumers.Add(getActionTask(action)); 
    } 

    await Task.WhenAll(consumers); 
} 

private Task getActionTask(Func<string, Task> action) 
{ 
    return Task.Run(async() => 
    { 
     // Do something that returns a string 
     String data = "Some string here"; 
     await action(data); 
    } 
} 

는 첫 번째 스레드는 루프에 "안녕하세요"인쇄하는 Task.Delay(TimeSpan.FromSeconds(30)); 두 번째 스레드를 할 것입니다 데이터를 기반으로 내가 2 개 스레드를 실행 말할 수 있습니다합니다.

지연이 끝나기 전에 인쇄 루프가 실행되지 않습니다. 구현에 문제가 있습니까?

+0

지연 및 인쇄 문을 사용하여 코드를 게시 할 수 있습니까? 그건 그렇고, Task.Run에 대한 호출에서'await 액션 (데이터)'을 래핑하지 말고 필요 없다. 'getActionTask' 메소드는 단지'action (data);을 리턴해야합니다. –

답변

0

Task.WhenAll은 작업이 병렬로 실행될 것이라고 말하지 않습니다. WhenAll 메서드에 대한 인수로 전달한 모든 작업이 완료되면 완료 될 Task을 만듭니다.

코드를 병렬로 실행하려면 Parallel 클래스 ForEach 메서드를 사용해야합니다.

업데이트

한 그의 의견은 Parallel 클래스의 함수는 비동기 방식으로 작동하지 않는다는 것입니다에 스콧은 아래 지적 중요. 비동기 메소드를 사용하려면 TPL Dataflow을 대신 사용해야합니다.

+2

주목해야 할 중요한 점 중 하나는 'Parallel' 클래스의 함수가 비동기 메소드에서 작동하지 않는다는 것입니다. 비동기 메소드를 사용하려면 [TPL Dataflow'] (https://msdn.microsoft.com/en-us/library/hh228603(v=vs.110) .aspx)를 사용해야합니다. –

+0

@ScottChamberlain이 점을 알려 주셔서 감사합니다! 나는 대답에 그것을 포함시킬 것이다. – Christos