2009-07-21 22 views

Trả lời

21

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ự để 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ó sẵn.

+0

Sử dụng Trình quản lý luồng.Đồng thời cũng nên hoạt động? –

+0

@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ụ. –

+1

@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. –

Các vấn đề liên quan