Tôi có một ứng dụng tạo một vài trăm kết nối TCP cùng một lúc và nhận được một luồng dữ liệu liên tục từ chúng.Thay thế Socket.ReceiveAsync bằng NetworkStream.ReadAsync (awaitable)
private void startReceive()
{
SocketAsyncEventArgs e = new SocketAsyncEventArgs();
e.Completed += receiveCompleted;
e.SetBuffer(new byte[1024], 0, 1024);
if (!Socket.ReceiveAsync(e)) { receiveCompleted(this, e); }
}
void receiveCompleted(object sender, SocketAsyncEventArgs e)
{
ProcessData(e);
if (!Socket.ReceiveAsync(e)) { receiveCompleted(this, e); }
}
nỗ lực của tôi dẫn đến một cái gì đó như thế này:
private async void StartReceive()
{
byte[] Buff = new byte[1024];
int recv = 0;
while (Socket.Connected)
{
recv = await NetworkStream.ReadAsync(Buff, 0, 1024);
ProcessData(Buff,recv);
}
}
Vấn đề tôi đã có được phương pháp gọi StartReceive()
sẽ chặn, và không đến được đi kèm StartSend() method called after
StartReceive() . Creating a new task for
StartReceive() would just end up with 300-ish threads, and it seems to do so just by calling
StartReceive() `anyways.
Điều gì sẽ là phương pháp đúng đắn về thực hiện mới async
và await
từ khóa trên mã hiện tại của tôi trong khi sử dụng một NetworkStream
vì vậy nó được sử dụng hồ bơi thread Socket.SendAsync()
và Socket.ReceiveAsync()
đang sử dụng để tránh phải có hàng trăm đề/nhiệm vụ?
Có lợi thế về hiệu suất nào khi sử dụng networkstream
theo cách này qua cổng hoàn thành i/o với beginreceive
không?
Nó không thực sự rõ ràng vấn đề là gì, hoặc ngữ cảnh - bạn nói về chặn phương thức gọi ... nó chặn gì? Đó không phải là vấn đề bạn cần sửa chưa? Vui lòng làm rõ câu hỏi của bạn - cũng như cho biết liệu tất cả "công việc" thực có bất kỳ mối quan hệ luồng nào không (ví dụ: với chuỗi giao diện người dùng). –
Vấn đề chính là, phiên bản sử dụng đang chờ NetworkStream.ReadAsync khiến ứng dụng tạo một chuỗi cho mỗi kết nối. Ở đâu khi sử dụng Socket.ReceiveAsync dường như di chuột dưới 30 luồng cho tất cả 300 kết nối. – Josh