2014-03-24 36 views
-1

在按鈕點擊我已經解僱呼叫StartContinuousThread這使輪詢每隔一秒服務器。異步線程壽命和WPF UI更新

public class ThreadsWindow 
{ 
    CancellationTokenSource wtoken = new CancellationTokenSource(); 
    private void btnStartTest_Click(object sender, RoutedEventArgs e) 
    { 
     StartContinuousThread(); 
    } 

    void StartContinuousThread() 
    { 
     while(true) 
     { 
      var fact = Task.Factory.StartNew(() => 
      { 
       CallServer(); 
       Task.Delay(1000, wtoken.Token); 
      }, 
      wtoken.Token); 
     } 
    } 
} 

StartContinuousThread開始執行,但btnStartTest_Click event handler完成它的執行。

StartContinuousThread method如何在此 的情況下更新UI?

不知是否StartContinuousThread也終止了與事件處理程序,因爲是重新加入無需等待關鍵字。

請幫幫忙!

+0

該代碼有幾個問題..你究竟想要做什麼? – dcastro

+0

你想在'CallServer'返回後更新UI線程嗎? – dcastro

回答

2

如果你的目標是每秒鐘輪詢服務器,你有一些問題。

  1. 沒有循環。您執行一次該方法,然後停止。

  2. 創建使用Delay一個任務,然後將其忽略。你應該創造這個任務的延續,去完成剩下的工作,實際上什麼都不做。

下面是解決這些問題的實現:

private async Task StartContinuousThread(CancellationToken token) 
{ 
    while (true) 
    { 
     token.ThrowIfCancellationRequested(); 
     await Task.Run(() => CallServer()); 
     await Task.Delay(1000, token); 
    } 
} 

另一種可能性,特別是如果你使用的C#的舊版本,將使用定時器運行一些代碼每一秒。

至於更新UI;您可以在此示例的任何地方撥打Task.Run以外的任何位置自由地進行操作。在你的例子中,你需要使用一些機制來回傳給UI線程,例如捕獲UI的同步上下文併發布到它。

+0

謝謝,你會解釋一下關於編組回到UI線程。 btb我在錯過while循環的同時張貼在這裏。 – Abhijeet

+0

@lakshyaleader這是一個廣泛討論的話題,你可以很容易地研究,如果你想知道更多。 – Servy