2012-11-25 212 views
2

我有一個簡單的WinRT應用程序,它將通過TCP與遠程服務器進行通信。ConnectAsync阻塞UI線程

爲了做到這一點,我創建新StreamSocket對象,並連接到遠程服務器點擊正確的按鈕,這樣以後:

private async void ConnectButtonClick(object sender, RoutedEventArgs e) 
{ 
    StreamSocket socket = new StreamSocket(); 
    HostName host = new HostName("192.168.1.15"); 
    await socket.ConnectAsync(host, "12121"); 
} 

的問題是,這個代碼是阻塞UI線程。我已經創建了簡單的動畫,使用連續運行在屏幕上的MonoGame(幾個移動的小精靈),以檢查UI是否被阻止。

問題是,單擊連接按鈕後,動畫凍結一秒鐘,所以我假設,連接到服務器是在UI線程中進行的。

我應該把整個網絡代碼放到一個單獨的線程中,還是這個異步/等待足夠?

我想實現一個循環,將處理傳入的數據(與幫助OD DataReader的),像這樣:

private async void ReceiveLoop() 
{ 
    bool running = true; 

    while (running) 
    { 
     try 
     { 
      uint numStrBytes = await _reader.LoadAsync(BufferSize); 

      if (numStrBytes == 0) 
      { 
       Disconnect(); 
       return; 
      } 

      string msg = _reader.ReadString(numStrBytes); 

      OnLog(string.Format("Received: {0}", msg)); 
      OnDataReceived(msg); 
     } 
     catch (Exception exception) 
     { 
      OnLog("Receive failed with error: " + exception.Message); 

      Disconnect(); 
      running = false; 
     } 
    } 
} 

發送數據將使用StoreAsync從DataWriter來完成。

所以我應該把這些功能放到不同的線程中嗎?

回答

0

難道你不能只是嘗試在後臺線程上做到這一點,看看是否有幫助?事情是這樣的:

Task.Run(
    async() => 
    { 
     StreamSocket socket = new StreamSocket(); 
     HostName host = new HostName("192.168.1.15"); 
     await socket.ConnectAsync(host, "12121"); 
    }); 
+0

謝謝,使用這種方式不會阻塞UI線程(沒有凍結,同時連接)。 問題是,當我從服務器發送/接收消息時,我仍然看到很短的凍結,但我認爲它與我在這裏問的其他問題有關:http://stackoverflow.com/questions/13561731/ winrt-blocking-task – Axadiw

+0

我認爲這不是一個好的解決方案,因爲它沒有發現基本問題。它涵蓋了它。 – usr