2017-03-21 8 views
0

정기적 인 타이머 (10 초)를 구현해야합니다. 그러면 몇 가지 변경 사항을 확인하고 데이터베이스와 UI를 업데이트합니다. "작업"이 끝날 때까지 기다렸다가 타이머를 다시 시작해야합니다. "Job"이 시작될 때작업 항목이 완료 될 때까지 UWP ThreadPoolTimer가 대기합니다.

timer.Cancel() 

을 호출 한 다음 완료되면 타이머를 다시 만듭니다. 하지만 async 키워드를 사용하는 작업 항목 처리기를 사용할 때 스레드 풀 작업 항목이 처리기의 모든 코드가 실행되기 전에 전체 상태로 설정 될 수 있습니다.

private bool IsStop = false; 

    private async Task DoWork() 
    { 
     try 
     { 
      if (IsStop) 
      { 
       Stop(); 
       return; 
      } 
      timer.Cancel(); 
      var resultIds = await DB.getUnresolvedData(); 

      if (resultIds.IsNullOrEmpty()) 
      { 
       return; 
      } 
      var json = await server.RequestSTatus(resultIds); 

      if (string.IsNullOrEmpty(json)) 
       return; 
      Model result = JsonConvert.DeserializeObject<Model>(json); 
      UpdateDB(result); 
     } 

     catch (Exception ex) 
     { 

     } 

     finally 
     { 
      Start(); 
     } 
    } 

    public void Start() 
    { 
     if (IsStop) return; 

     timer = ThreadPoolTimer.CreatePeriodicTimer(async (t) => 
     { 
      await DoWork(); 
     }, TimeSpan.FromSeconds(10)); 
    } 

문제는, 내가 "작업"이 완료 될 때까지 기다릴 수있는 방법을 다시 시작된다 전체 코드를 참조하십시오?

답변

1

조금 다를 수 있습니다. 하지만 코드는 더 명확해질 것이며 어쨌든 ThreadPool을 사용할 것입니다. 그냥 Task.Delay 타이머를 사용하십시오. 이 같은.

private bool isRunning; 

    public async void Start() 
    { 
     if (isRunning) 
      return; 

     isRunning = true; 
     while (isRunning) 
     { 
      await DoWork(); 
      //wait period. 
      await Task.Delay(TimeSpan.FromSeconds(10)); 
      if (!isRunning) 
       return; 
     } 
    } 

    private async Task DoWork() 
    { 
     //Do your work here. 
    } 

    public void Stop() 
    { 
     isRunning = false; 
    } 

그냥 일반적인 생각입니다.

+0

나는 앱 일시 중지시 '일시 중지()'와 같이 worker 전역을 중지하려면 'private bool IsStop = false; '를 사용하고있었습니다. –