По пытался написать асинхронно работающий на сокетах сервер. Код в основном взял из:
https://www.microsoft.com/Rus/Msdn/Magazine/2005/08/Winsock.mspx раздел "Асинхронный ввод-вывод"(впрочем практически аналогичное у меня получилось до чтения этого материала, после изучения help-а).
Столкнулся со следующей проблемой.
В методах AcceptCallback, ReceiveCallback, которые вызываются по завершении асинхронных операций BeginAccept и BeginReceive соответственно, используются сокеты так или иначе полученые IAsyncResult.AsyncState.
При закрытии сокетов (Socket.Close) (серверного сокета и сокетов созданных при получении входящего соединения от клиентов) методы AcceptCallback, ReceiveCallback вызываются, но сокет полученный из IAsyncResult.AsyncState уже закрыт, соответственно получаю исключение System.ObjectDisposedException: Cannot access a disposed object.
Конечно можно обойти эту проблему, использовать какой либо доп. флаг и т.д. и т.п.
Но хотелось бы узнать может есть какое-либо более оригинальное решение или подход...
Здравствуйте, ilya39, Вы писали:
I>По пытался написать асинхронно работающий на сокетах сервер. Код в основном взял из: https://www.microsoft.com/Rus/Msdn/Magazine/2005/08/Winsock.mspx раздел "Асинхронный ввод-вывод"(впрочем практически аналогичное у меня получилось до чтения этого материала, после изучения help-а).
I>Столкнулся со следующей проблемой.
I>В методах AcceptCallback, ReceiveCallback, которые вызываются по завершении асинхронных операций BeginAccept и BeginReceive соответственно, используются сокеты так или иначе полученые IAsyncResult.AsyncState.
I>При закрытии сокетов (Socket.Close) (серверного сокета и сокетов созданных при получении входящего соединения от клиентов) методы AcceptCallback, ReceiveCallback вызываются, но сокет полученный из IAsyncResult.AsyncState уже закрыт, соответственно получаю исключение System.ObjectDisposedException: Cannot access a disposed object.
I>Конечно можно обойти эту проблему, использовать какой либо доп. флаг и т.д. и т.п.
I>Но хотелось бы узнать может есть какое-либо более оригинальное решение или подход...
Перед socket.Close нужно вызывать socket.Shotdown — чтобы запретить отправку/получение данных.
Написал два сервера на сокетах! подобное было обходился флажками!
Врядли чтото другое есть если найдёш расскажеш!
Sonik
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение