2015-06-16 56 views
1

我使用WPF 4.5和MVVM卡利Micro和具有以下WPF代碼:以上WPF 4.5:如何創建子線程並繼續任務到UI主線程?

public class MainViewModel: Screen 
{ 
    public MainViewModel() 
    { 
     if (!ConnectServer()) 
     { 
      Console.WriteLine("Connection failed"); 
      return; 
     } 
     // Following method can only be run if server connection established 
     ProcessThis(); 
    } 
} 

我的代碼只有一次機會來連接,如果失敗則顯示視圖,什麼也不做。如果我使用while(!ConnectServer()),它將一直阻塞UI線程,這意味着連接仍然失敗時,用戶不會顯示任何內容。這非常難看。

我想要什麼:

  1. 如果連接失敗,意味着ConnectServer的()返回false,應等待10秒鐘,然後嘗試重新連接,並再次(如調用一個方法RetryConnect())。直到它成功而不會阻塞 UI線程。
  2. 連接後,它應該繼續到主線程並運行ProcessThis()。

理論上我知道它需要背景分離的線程,但我不知道如何實現它簡單和良好。請隨意使用我的示例代碼來解釋。先謝謝你。

+0

這是異步/ AWAIT是什麼https://msdn.microsoft.com/en-us/library/hh191443.aspx –

+0

['DispatcherTimer'](https://msdn.microsoft.com/ en-us/library/system.windows.threading.dispatchertimer(v = vs.110).aspx)fits。 – Sinatr

回答

3

要啓動後臺任務,您可以使用Task.Run方法。 而在主線程可以使用頁面調度執行代碼(VM上下文的情況下,我已經把Application.Current.Dispatcher的調用)

public class MainViewModel: Screen 
{ 
    public MainViewModel() 
    { 
     Task.Run(() => 
     { 
      while (!ConnectServer()) 
      { 
       Console.WriteLine("Connection failed"); 
       Thread.Sleep(10*1000); 
      } 

      // Following method can only be run if server connection established 
      Application.Current.Dispatcher.Invoke(ProcessThis); 
     } 
    } 
} 

而不是使用調度的,你可以利用新的異步/等待功能來實現它。

public class MainViewModel: Screen 
{ 
    public MainViewModel() 
    { 
     Initialize(); 
    } 
} 

private async void Initialize() 
{ 
     await Task.Run(async() => 
     { 
      while (!ConnectServer()) 
      { 
       Console.WriteLine("Connection failed"); 
       await Task.Delay(10*1000); 
      } 
     } 

     // Following method can only be run if server connection established 
     ProcessThis(); 
} 
+0

非常明確的解釋!非常感謝你。 – MagB

相關問題