2017-03-21 83 views
0

我需要實現一個定期計時器(10秒),它將檢查一些更改並更新數據庫和UI。我需要等到「作業」完成,然後再次啓動計時器。我打電話UWP ThreadPoolTimer等到工作項完成

timer.Cancel() 

「Job」開始,然後在完成時再次創建計時器。但似乎當我使用使用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

我正在使用 'private bool IsStop = false;'阻止工作者全局,例如App暫停時的'Pause()' –