2

저는 C#의 Pro .NET 4 병렬 프로그래밍이라는 책을 Adam Freeman이 읽고 있습니다. 2 장 13 페이지에서는 을 사용하여 task1.Result을 사용하여 결과가 반환 될 때까지 기다리는 방법에 대해 설명합니다. 왜 task2task1이 끝날 때까지 기다려야하는지 이해가 안됩니다. 그들은 서로 다른 스레드에 있습니다.C# .net 4 병렬 프로그래밍

은 아래와 같이 뭔가 :

Task<int> task1 = new Task<int>(() => { ... ; return sum }); 
task1.Start(); 
Console.WriteLine("Result 1: {0}", task1.Result); 

Task<int> task2 = new Task<int>(() => { ... ; return sum }); 
task2.Start(); 
Console.WriteLine("Result 2: {0}", task2.Result); 

나는 그것이 task1 것 같아 바닥에 선을 아래로 이동하면 아직도 내가 시도 횟수 첫번째 상관없이 실행합니다.

Console.WriteLine("Result 1: {0}", task1.Result); 

왜 이런 일이 발생합니까?

답변

0

먼저 실제로 완료되는 작업 즉, 반환 문을 먼저 수행하는 작업은 공식적으로 예측할 수 없습니다. 결과를 수락하기 전에 작업을 마칠 수 있습니다.

샘플 작업이하는 작업이 그다지 크지 않으면 결과를 받아들이지 않거나 Java 스레딩 용어에 동의하지 않아도 먼저 task1이 완료 될 수 있습니다. 너 시작했기 때문이야.

아마도 당신은 어떻게 든 그 task1이 먼저 끝난 것을 알 것입니다. 작업을위한 코드에 Console.WriteLine이 있습니까? 그렇다면 콘솔 하위 시스템이 작업을 직렬화하므로 두 번째 작업을 시작하기 전에 작업을 먼저 수행해야 완전히 완료됩니다. 이 방법으로 생각해보십시오. 귀하의 두 가지 과제는 콘솔과 경쟁하며, 승자는 모든 것을 처리합니다.

task1은 주전산기가 두 번째 new으로 task2를 만들기도 전에 꺼져서 작동하기 때문에이 경기에서 부당한 이점이 있습니다.

+0

답해 주셔서 감사합니다 – Fei

3

Task.Result 블록은 Task이 완료 될 때까지 차단됩니다.

돌아 가기 위해서는 결과가 있어야합니다!

따라서 첫 번째 예에서는 이 완료 될 때까지 task2이 시작되지 않습니다.

task1.Result을 맨 아래로 이동하면 어떤 작업이 먼저 완료되는지 알 수 없지만 Console.WriteLine 문은 순차적으로 실행됩니다.

+0

Nicholas, 답장을 보내 주셔서 감사합니다. 나는 task를 이해할 수있다. task는 task가 끝날 때까지 기다릴 것이다.task1이 이미 시작된 경우 실행할 다른 작업 (스레드)을 시작할 수 없습니까? foreach (메시지의 문자열 msg) {작업 tsk = 새 작업 (obj => printMsg (obj), msg); tsk.Start();}. foreach 루프 내부의 작업은 병렬로 실행됩니다. – Fei

0

task.Wait() 메서드를 사용해보십시오.

 Task<int> task1 = new Task<int>(() => { int sum = 0; return sum; }); 
     task1.Start(); 
     task1.Wait(); 
     Console.WriteLine("Result 1: {0}", task1.Result); 

     Task<int> task2 = new Task<int>(() => { int sum = Enumerable.Range(1, 10).Sum(); return sum; }); 
     task2.Start(); 
     task1.Wait(); 
     Console.WriteLine("Result 2: {0}", task2.Result); 
+0

동일한 결과를 주어야하지만 명시 적으로 "대기"하기 때문에 읽기가 훨씬 쉽습니다. – Bengie

+0

답변 해 주셔서 감사합니다. – Fei

0

"Console.WriteLine ("결과 1 : {0} ", task1.Result) task1이 완료 될 때까지 실행할 수 없기 때문에/블록을 대기합니다.

작업이 서로 독립적으로 실행되는 동안 호출 스레드는 console.writeline을 순차적 순서로 호출합니다. 이 두 가지 작업의 결과는 순서에 맞춰야합니다.

0

Task task1 = new Task(() => { ... ; return sum });
task1.Start();
Task task2 = new Task(() => { ... ; return sum });
task2.Start();
task1.Wait()
Console.WriteLine("Result 1: {0}", task1.Result);
task2.Wait()
Console.WriteLine("Result 2: {0}", task2.Result);

이보십시오. 여기서 console.writeline을 호출하기 전에 두 작업을 모두 시작해야합니다.