while (TcpClient.Client.Available == 0)
{
Thread.Sleep(5);
}
Bunu yapmanın daha iyi bir yolu var mı?TcpClient verilerinin kullanılabilir hale gelmesini beklemenin en iyi yolu?
while (TcpClient.Client.Available == 0)
{
Thread.Sleep(5);
}
Bunu yapmanın daha iyi bir yolu var mı?TcpClient verilerinin kullanılabilir hale gelmesini beklemenin en iyi yolu?
Kesinlikle! Akışta sadece Read(...)
numaralı telefonu arayın. Veriler mevcut olana kadar engellenecektir. Gerçekten , TcpClient
'u kullanmak için'a sahip olmadıkça, akışta normalde mümkün olduğunca çok şey yapardım. Soketi kullanmak isterseniz, veri mevcut olana kadar (veya soket kapalı) Receive(byte[])
numaralı telefonu arayın.
Artık engellemek istemiyorsanız, eşzamansız çalışmak için Stream.BeginRead
veya Socket.BeginReceive
'u kullanabilirsiniz. (. Veya ReadAsync
.NET 4.5 itibariyle)
Ben şahsen hemen hemen yararsız olduğu Available
bulup bir uyku yuvarlak döngü kesinlikle verimsizdir (dereler ve prizleri her ikisi birden) - bağlam anahtarına sahip olmak istemiyoruz veri gelmediğinde iş parçacığı ve veri içeri geldiğinde uykunun bitmesini beklemek istemezsiniz.
StreamReader.ReadToEnd() kullanımı da işe yaramalı mı? –
@Jader: Yalnızca diğer uçtan * metni geçiriyorsa ve * gönderimi bittiğinde soketi kapatır. Örneğin, HTTP KeepAlive bağlantıları için iyi değil. –
@tig: "ReadLine" öğesi null değerini döndürürse, bu, akımın kapatıldığı ve daha fazla satır bulunmadığı anlamına gelir. Ağ seviyesinde olup bitenlere bakmanız gerektiği gibi geliyor. Wireshark ile. –