2015-12-21 17 views
0

條件我有兩個日期時間。一個是當前的,另一個是比賽開始的日期時間。現在我想在後臺線程(我不知道線程)中連續檢查這個分鐘差異。當它符合if(remainingMinutes < = 4)我想更新UI。如何用線程在後臺實現這個?不斷檢查,如果在不同的線程

public RelayCommand OpenSetBets 
    { 
     get { return _setBets ?? (_setBets = new RelayCommand(ExecuteSetBets, CanExecuteSetBets)); } 
    } 

    private void ExecuteSetBets() 
    { 
     _navigation.NavigationToSetBetsDialogue(); 
    } 

    private bool CanExecuteSetBets() 
    { 
     // Thread t = new Thread(newthread); 
     double? remainingMinutes = null; 

     if (UK_RaceDetail.Count() != 0) 
     { 
      //t.Start();      
      DateTime CurrentUTCtime = DateTime.UtcNow; 
      DateTime NextRaceTime = UK_RaceDetail[0].One.Time; 
      remainingMinutes = NextRaceTime.Subtract(CurrentUTCtime).TotalMinutes; 
     } 

     if (remainingMinutes <= 4) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 

    } 

更新後的代碼。 我想啓用按鈕如果比賽將在未來4分鐘開始。

+0

從代碼中顯示它真的不清楚你想要什麼,但是WaitHandle或者忙碌循環都應該這樣做。 – CodeCaster

+0

您可以使用計時器對於這一點,創建一個定時器對象與時間,你需要了最新的UI一些這樣的事 –

+0

定時器=新定時器(1000)的區別; //這裏我們設置爲1秒即1000毫秒 \t //這裏設定的時間u需要在烏爾情況 \t timer.Elapsed + =新ElapsedEventHandler(timer_Elapsed); \t timer.Enabled = true; 靜態無效timer_Elapsed(對象發件人,ElapsedEventArgs E) { \t //這裏更新烏爾UI } –

回答

2

如果你只是想用你的後臺任務監視日期/時間,我建議你不要創建一個新的Thread

對於WPF,而不是線程,你可以嘗試使用DispatcherTimer對象及其Tick事件

System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer(); 
dispatcherTimer.Tick += dispatcherTimer_Tick; 

有關的WinForms,你可以使用Timer對象及其Tick事件

System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); 
timer.Tick += timer_Tick; 

這樣,您可以使用ThreadThreadPool

編輯:使用Task.Delay,因爲一些人喜歡這種比較「乾淨」的方式,看到評論由阿隆先生

+0

儘管這個「技術上有效」,但我不贊成地做它。簡單地設置一個定時器在你想要的時間運行會更有意義。 – Aron

+0

你是說,你不喜歡'Tick'事件? – Ian

+0

例如'await Task.Delay(raceStart - DateTimeNow)' – Aron

1

您可以使用Task.Run一樣,

System.Threading.Tasks.Task.Run(async() => 
{ 
    //starts running in threadpool parallelly 
    while (!CanExecuteSetBets()) 
    { 
     await Task.Delay(500); //wait 500 milliseconds after every check 
    } 

    DoYourWork(); //trigger your work here 

}).ConfigureAwait(false);