차이

2015-01-14 1 views
10

CancellationTokenSource 종료 플래그 종료 루프 작업의 차이가 있는지 궁금 해서요차이

CancellationTokenSource :

CancellationTokenSource cancellationTokenSource; 
Task loopTask; 

void StartLoop() 
{ 
    cancellationTokenSource = new CancellationTokenSource(); 
    loopTask = Task.Factory.StartNew(Loop, TaskCreationOptions.LongRunning); 
} 

void Loop() 
{ 
    while (true) 
    { 
     if (cancellationTokenSource.IsCancellationRequested) 
      break; 

     Thread.Yield(); 
    } 
} 

void StopLoop() 
{ 
    cancellationTokenSource.Cancel(); 

    loopTask = null; 
    cancellationTokenSource = null; 
} 

종료 플래그 :

volatile bool exitLoop; 
Task loopTask; 

void StartLoop() 
{ 
    exitLoop = false; 
    loopTask = Task.Factory.StartNew(Loop, TaskCreationOptions.LongRunning); 
} 

void Loop() 
{ 
    while (true) 
    { 
     if (exitLoop) 
      break; 

     Thread.Yield(); 
    } 
} 

void StopLoop() 
{ 
    exitLoop = true; 

    loopTask = null; 
} 

저에게있어 CancellationTokenSource, btw를 사용하는 이유는 취소 토큰이 Task factory에 매개 변수로 추가 될 수있는 이유가 무엇입니까?

답장을 보내 주셔서 감사합니다.

최저 ragards 당신이 그것에 대해 생각하지 않아도, 필요한 모든 동기화를 처리하기 위해 토큰을 CancellationToken을 허용 사용

답변

9
  1. teamol.
  2. 작성시 사용 된 토큰으로 인한 결함이 Task 인 경우, 오류가 아닌 Task의 상태를 취소로 설정합니다. boolean을 사용하면 (그리고 throw하지 않음) 작업이 실제로 취소 되었더라도 실제로 완료로 표시됩니다.
  3. 부울과 달리 참조 유형이므로 CTS 참조는 다른 위치에서 전달되고 취소 될 수 있습니다. 이것은 이들 위치가 부울 필드를 사용하는 경우와 같은 방법으로 결합 될 필요가 없다는 점에서 중요합니다. 작업이 언제 취소되는지를 결정하는 코드 나 취소에 반응하는 코드는 서로에 대해 알아야합니다. 이를 통해 더 많은 모듈화, 추상화, 개별 상황과 관련없는 높은 수준의 기능이 가능합니다.
  4. 코드에 향상된 의미 론적 의미를 추가합니다.
+0

TaskCancelation의 올바른 사용 예를 제공해 주시겠습니까? 그래서 작업 상태가 실행 중 변경됩니까? 그리고 새로운 방법으로 시작된 토큰을 어떻게 얻을 수 있습니까? – Teamol

+0

@Teamol'Run','StartNew' 및'ContinueWith'는 모두 취소 토큰에 대한 매개 변수를 가지고 있습니다. 1 대 1로 전달하십시오. – Servy