請原諒我對任務和異步的認識不足。TcpClient;的NetworkStream; ReadAsync; C#
使用TcpClient類我建立與可用服務器的連接:
void async RunClientAsync()
{
TcpClient client = new TcpClient();
try
{
await client.ConnectAsync(IPAddress.Parse("1.1.1.1"), 8889);
Task.Start(() => ReadClientAsync(client));
}
catch (Exception ex)
{
HandleException(ex);
}
}
// -----
void async ReadClientAsync(TcpClient client)
{
byte[] bf = new byte[2048];
try
{
while(true)
{
int br = await client.NetworkStream().ReadAsync();
if (br > 0)
{
HandleInboundData(bf, br);
}
}
}
catch (Exception ex)
{
HandleException(ex);
}
}
的輔助方法HandleException(異常前)和HandleInboundData(字節[]緩衝液,INT長度)將執行假定任務。
與服務器的連接將是永久和從服務器接收到的數據將是未知的長度和頻率的,其想法是拋出一個任務在那裏,接收和處理,只有當數據是可用的入站數據。
ReadClientAsync(TcpClient客戶端)明顯失敗,因爲如果沒有可用數據,ReadAsync將始終返回0字節。
我應該如何使用async/task編寫ReadClientAsync以防止繁忙循環情況?在這些情況之前,我已經使用了BeginRead/EndRead,它工作正常。這是否是這種特殊情況下的解決方案?
謝謝,
謝謝你的評論。這是來自ReadAsync的MSDN條目:「表示異步讀取操作的任務。TResult參數的值包含讀入緩衝區的總字節數。如果當前可用的字節數小於請求的數字,結果值可能會小於請求的字節數,如果已到達流的末尾,結果值可能爲0(零)。「我理解了流的結束意味着流中沒有數據要讀取。 – Jam
瞭解。謝謝Luaan。我相信我明白問題出在哪裏。 – Jam