2015-09-30 20 views
1

追查我有以下代碼(_ns是的NetworkStream)ReadAsync退出,沒能在調試

await GetResponse(_ns); 
btnSend.Enabled = true; 

private async Task GetResponse(NetworkStream stream) 
{ 
    while (true) 
    { 
     var readBuffer = new byte[4096]; 
     var asyncReader = await stream.ReadAsync(readBuffer, 0, readBuffer.Length); 
     txtBoxMessagesIn.Text += Encoding.ASCII.GetString(readBuffer.ToArray()) + Environment.NewLine; 
     if (asyncReader <= 0) break; 
    } 
} 

我似乎充滿了我所期望的整個緩衝區,但從未啓用btnSend。當我在調試模式下運行它時,我的while循環運行了幾次,我看到asyncReader被設置爲不同的值,但它不會等於0,因爲我期望它會中斷循環,它只是退出在線:

var asyncReader = await stream.ReadAsync(readBuffer, 0, readBuffer.Length); 

沒有產生任何錯誤。這是什麼造成的?我是否需要在Visual Studio中設置某些內容以打破此類錯誤?

+0

非相關錯誤:'readBuffer'已經是一個數組,你不需要調用'readBuffer.ToArray()',但是你應該在那裏使用'asyncReader'的值。 –

+0

在嘗試提取內容之前,可能與您的問題無關,但不應該測試'if asyncReader <= 0)嗎? –

+0

'NetworkStream'不像其他流。你不能以這種方式使用它。 –

回答

3

ReadAsync只會返回0。這就是所有流的工作原理。如果流尚未結束(即,對於套接字流,套接字仍處於打開狀態),則ReadAsync將(異步)等待流讀取更多字節或結束。

我假設套接字的另一端剛剛懸空但不發送更多數據。在這種情況下,任何流讀取都會等待它發送更多字節或關閉。沒有例外 - 這不是特殊情況。由於套接字未關閉,流讀取將不會返回0,因此您的while循環不會退出。

+0

出於興趣,你會知道是什麼導致退出?我會認爲,如你所述,它會永遠循環,但事實並非如此。 – Family

+0

@家庭:什麼讓你覺得它退出?如果退出,任務將完成並啓用按鈕。 –

+0

這是我第一次嘗試使用異步並等待。我不完全理解它。我只是被調試過程弄糊塗了,它並沒有連續地通過while循環,它似乎完成了。我認爲這是因爲流中沒有任何東西。我會進一步閱讀這個過程。 – Family

0

您可以將調用包裝到try/catch語句中的ReadAsync中,也可以檢查任務的結果。我會用try/catch方法去看看最初看到的是什麼。

try { var asyncReader = await stream.ReadAsync(readBuffer, 0, readBuffer.Length); } 
catch (Exception ex) { } 

其他方法如下,但是您不能確定ReadAsync是否在異常發生時正常結束。當流結束

var task = stream.ReadAsync(readBuffer, 0, readBuffer.Length); 
task.Start(); 
if (task.Exception != null) 
    // see what's going here 
+0

我似乎還沒有得到例外。這很奇怪。 – Family