При выполнении этого кода:Получение IOException с NetworkStream.BeginRead()
private async void StartChat(Object obj)
{
TcpClient me = (TcpClient)obj;
UpdateChatBox("Attempting read from server.");
myBuffer = new byte[BUFFER_SIZE];
while (true)
{
var myStream = me.GetStream();
myStream.BeginRead(myBuffer, 0, BUFFER_SIZE, new AsyncCallback(UpdateChatBoxAsync), myStream);
if (messageToSend)
{
await myStream.WriteAsync(myMessage, 0, myMessage.Length);
}
}
}
Я получаю следующее исключение ввода-вывода из BeginRead
:
Невозможно прочитать данные из транспортного соединения: Операция сокета не может быть выполнена, потому что в системе недостаточно места для буфера или потому, что очередь заполнена.
Вот метод обратного вызова для BeginRead:
private void UpdateChatBoxAsync(IAsyncResult result)
{
var stream = result.AsyncState as NetworkStream;
int bytesRead = stream.EndRead(result);
if (bytesRead > 0)
{
String newMessage = NetworkUtils.GetString(myBuffer);
UpdateChatBox(newMessage);
}
}
Может кто-то пожалуйста, пролить некоторый свет, по той причине, что это исключение, которого воспитали? Я попытался воссоздать буфер каждый раз в начале цикла while, но пока это не улучшало исключение, я не получал сообщения с сервера.
Я также попытался сбросить myBuffer на пустой массив в конце UpdateChatBoxAsync, это тоже не сработало.
Любая помощь будет оценена по достоинству.
Это низкоуровневая ошибка Windows, WSAENOBUFS. Довольно необычно, чтобы получить это при вызове BeginRead. Может быть [исчерпание пула ядра] (http://technet.microsoft.com/en-us/library/7a44b064-8872-4edf-aac7-36b2a17f662a.aspx), может быть, у вас слишком много открытых сокетов. –