我有一個簡單的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來完成。
所以我應該把這些功能放到不同的線程中嗎?
謝謝,使用這種方式不會阻塞UI線程(沒有凍結,同時連接)。 問題是,當我從服務器發送/接收消息時,我仍然看到很短的凍結,但我認爲它與我在這裏問的其他問題有關:http://stackoverflow.com/questions/13561731/ winrt-blocking-task – Axadiw
我認爲這不是一個好的解決方案,因爲它沒有發現基本問題。它涵蓋了它。 – usr