2017-11-21 5 views
-2

웹 페이지 (REST 사용)를 주기적으로 확인한 다음 최종 응답을 기다리는 기능이 있습니다. "최종"응답을 다시 시도합니다.Missing CancellationToken.WaitHandle.Set() 또는 작업 완료를 나타내는 방법

void PeriodicallyCheckSomething() 
{ 
    Task.Run(() => { 
     var isTaskComplete = false; 
     while (!isTaskComplete) 
     { 
      CancellationToken.WaitHandle.Wait(5000); 
      if (isTaskComplete || CancellationToken.IsCancellationRequested) 
       return; 

      CheckProgress((isComplete) => { 
       isTaskComplete = isComplete; 
       CancellationToken.WaitHandle.Set(); // <== can't do this 
      }); 
     } 
    }); 
} 

// CheckProgress - exit's immediately, we use updateStatus to report the result 

void CheckProgress(Action<bool> updateStatus) 
{ 
    MakeWebRequest((data) => { 
     var isComplete = (data.Result == 999); 
     updateStatus(isComplete); 
    }); 
} 

작업을 정상적으로 종료하고 싶습니다. 결과를 얻을 때 isTaskComplete 플래그를 설정했지만 작업이 이미 대기 상태에 있습니다.

작업을 즉시 종료 할 수 있도록 Waithandle을 "설정"하고 싶습니다. 그러나 CancellationToken.Waithandle에는 Set 기능이 없습니다.

기다리는 더 좋은 방법은 ... 작업 취소와 Set와 같은 것을 사용하여 신호를 보낼 수있는 기능을 모두 지원합니까?

+0

분명히 코드가 잘못되었지만 동일한 결과로 원하는 최종 결과가 명확하지 않습니다. 예를 들어, 취소 토큰을 확인하는 것 외에는 아무 것도하지 않는 이유는 무엇입니까? – theMayer

+0

CancellationTokenSource.Cancel()이이 함수 외부에서 호출됩니다. 예를 들어 누군가 UI에서 취소 버튼을 누르면 –

+0

네, 그게 유일한 이유는 그것을 확인하는 것입니다. – theMayer

답변

0

MakeWebRequest를 차단 기능으로 사용했습니다.

void PeriodicallyCheckSomething() 
{ 
    Task.Run(() => { 
     var isTaskComplete = false; 
     while (!isTaskComplete) 
     { 
      CancellationToken.WaitHandle.Wait(5000); 
      if (CancellationToken.IsCancellationRequested) 
       return; 

      isTaskComplete = CheckProgress(); 
     } 
    }); 
} 

bool CheckProgress() 
{ 
    var data = MakeWebRequest(); 
    return (data.Result == 999); 
} 
0

Task.Delay을 사용하여 5000ms를 기다립니다. 오버로드 중 하나를 통해 CancellationTokenDelay 메소드에 전달할 수 있습니다. 완료 대 취소의 개념을 추적해야하는 이유가 표시되지 않습니다. 당신은 단순히 작업을 관계없이 끝내기를 원할뿐입니다.

0

내가해야 할 일은 작업을 실행 취소하고 취소 토큰을 제공하고 작업의 '외부'대기를 수행하는 것입니다. 즉, PeriodicallyCheckSomething() 메소드를 다른 곳에서 async 및 Task.Run으로 다시 레이블 할 수 있습니다. 그 다음 다른 곳에서는 기다림 등을 할 수 있습니다. 제 2c. 행운을 빌어 요.