Я думаю, что вы неправильно понимаете асинхронный ввод-вывод с TCP.
Чтобы запустить асинхронный ввод-вывод, вызовите stream.BeginRead ().
При обратном вызове вы вызываете EndRead в потоке.
Вы не вызываете BeginRead для TcpClient, как показывает ваш код. Ваше приложение никогда не подает сигнал WaitHandle. Уровень IO будет вызывать ваш обратный вызов, когда будет получен сигнал о ручке ожидания, другими словами, когда произойдет асинхронное чтение.
При обратном вызове обычно вы вызываете BeginRead снова в потоке, если возможно, что вы получите больше данных.
Вы можете увидеть четкий пример в этом ответе .
Перед началом танца BeginRead / EndRead,
вы можете захотеть выполнить асинхронное соединение на TcpClient - тогда вы будете использовать BeginConnect. Но это сделано только один раз. В качестве альтернативы вам может потребоваться синхронное соединение, в этом случае вы просто вызываете TcpClient.Connect ().
пример кода:
private class AsyncState
{
public NetworkStream ns;
public ManualResetEvent e;
public byte[] b;
}
public void Run()
{
NetworkStream networkStream = ...;
byte[] buffer = new byte[1024];
var completedEvent = new ManualResetEvent(false);
networkStream.BeginRead(buffer, 0, buffer.Length,
AsyncRead,
new AsyncState
{
b = buffer,
ns = networkStream,
e = completedEvent
});
// do other stuff here. ...
// finally, wait for the reading to complete
completedEvent.WaitOne();
}
private void AsyncRead(IAsyncResult ar)
{
AsyncState state = ar as AsyncState;
int n = state.ns.EndRead(ar);
if (n == 0)
{
// signal completion
state.e.Set();
return;
}
// state.buffer now contains the bytes read
// do something with it here...
// for example, dump it into a filesystem file.
// read again
state.ns.BeginRead(state.b, 0, state.b.Length, AsyncRead, state);
}