while (TcpClient.Client.Available == 0)
{
Thread.Sleep(5);
}
Có cách nào tốt hơn để thực hiện việc này không?Cách tốt nhất để chờ dữ liệu TcpClient trở nên khả dụng?
while (TcpClient.Client.Available == 0)
{
Thread.Sleep(5);
}
Có cách nào tốt hơn để thực hiện việc này không?Cách tốt nhất để chờ dữ liệu TcpClient trở nên khả dụng?
Tuyệt đối! Chỉ cần gọi Read(...)
trên luồng. Điều đó sẽ chặn cho đến khi dữ liệu có sẵn. Trừ khi bạn thực sự có để sử dụng trực tiếp TcpClient
, tôi thường làm càng nhiều càng tốt trên luồng. Nếu bạn muốn sử dụng ổ cắm, chỉ cần gọi Receive(byte[])
sẽ chặn cho đến khi dữ liệu khả dụng (hoặc ổ cắm được đóng).
Bây giờ nếu bạn không muốn chặn, bạn có thể sử dụng Stream.BeginRead
hoặc Socket.BeginReceive
để hoạt động không đồng bộ. (Hoặc ReadAsync
kể từ .NET 4.5.)
Cá nhân tôi thấy Available
là khá vô ích (trên cả hai luồng và ổ cắm) và vòng lặp với giấc ngủ chắc chắn là không hiệu quả - bạn không muốn chuyển ngữ cảnh chỉ khi dữ liệu chưa được đưa vào và bạn không muốn phải chờ cho đến khi kết thúc chế độ ngủ khi dữ liệu có có sẵn.
Sử dụng Trình quản lý luồng.Đồng thời cũng nên hoạt động? –
@Jader: Chỉ khi nó truyền văn bản từ đầu kia * và * nó sẽ đóng socket khi nó kết thúc gửi. Không tốt cho các kết nối HTTP KeepAlive, ví dụ. –
@tig: Nếu 'ReadLine' trả về null, điều đó có nghĩa là luồng đã bị đóng và không còn dòng nào nữa. Nó thực sự giống như bạn nên nhìn vào những gì đang xảy ra ở cấp độ mạng, ví dụ: với Wireshark. –