Запуск сервера:
await Task.Run(() =>
{
while (active)
{
try
{
Socket client = server.Accept();
LogEvent($"{client.RemoteEndPoint} is connected");
Task.Run(() =>
{
if (ProcessClient(client)) //тут добавление в `clientList` и обработка
{
DisconnectClient(client);
}
});
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
active = false;
}
}
});
Код отключения клиентов:
private void DisconnectClient(Socket client, bool autoRemove = true)
{
try
{
LogEvent($"{client.RemoteEndPoint} is disconnected");
client.Shutdown(SocketShutdown.Both);
if (client.Connected)
{
client.Disconnect(false);
}
if (autoRemove)
{
clientList.Remove(client);
}
client.Close();
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
private void DisconnectAllClients()
{
if (clientList != null)
{
clientList.ForEach((client) =>
{
DisconnectClient(client, false);
});
clientList.Clear();
}
}
Когда при нажатии кнопки вызываю DisconnectAllClients()
, то здесь:
if (ProcessClient(client))
{
DisconnectClient(client); <<здесь
}
возникает экскепшен
Вызвано исключение: "System.ObjectDisposedException" в System.dll
Доступ к ликвидированному объекту невозможен.
Имя объекта: "System.Net.Sockets.Socket".
По-этому, приходится делать через try
. Не пойму, нормальное ли это поведение и можно ли этого избежать ни во что не оборачивая Socket
?