Добрый день, дорогие разработчики.
У меня возникли некоторые проблемы с .Net framework 2, а именно с его классом TcpClient:
При использовании этого класса число дескрипторов(хэндлов, Handles) которыми пользуется процесс растет, но при уничтожении этого класса дескрипторы не освобождаются(не возвращаются виндовсу).
Это можно наблюдать в TaskMeneger'e;
Минимальный код демонстрирующий проблему:
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Bind(new IPEndPoint(ipLocalServer, portLocalServer));
sock.Listen(1);
DebugInfo.Info.WriteLine("Create server on {0}:{1}\n", ipLocalServer, portLocalServer);
EventArgsBoolOk argConnection = new EventArgsBoolOk();
while (true)
{
using (Socket sockClient = sock.Accept())
{
using (TcpClient client = new TcpClient())
{
client.Client = sockClient;
}
}
}
Необходимо запустить приложение, запустить TaskMeneger со вкладкой процессов и отоброжением кол-ва дескприторов. После этого несколько раз соединитесь с этим сервером telnet'ом. И посмотрите как стремительно растет число.
Тестируемые ОС windows XP SP 3, Windows server 2003 SR2
Из-за такой ошибки мой продукт у клиента на сервере довел скорость работы windows программ до очень низкого уровня. Поэтому мысли, что дескрипторы вернутся со временем не верны, никакой сборщик мусора их не вернет.
Скажите, нигде ли я не туплю? Как решить проблему?
Здравствуйте, Аноним, Вы писали:
А>Добрый день, дорогие разработчики. А>У меня возникли некоторые проблемы с .Net framework 2, а именно с его классом TcpClient: А>При использовании этого класса число дескрипторов(хэндлов, Handles) которыми пользуется процесс растет, но при уничтожении этого класса дескрипторы не освобождаются(не возвращаются виндовсу). А>Это можно наблюдать в TaskMeneger'e;
[...]
может потому что ShutDown для сокета client явно не вызываешь? хотя он должен вызываться в момент освобождения ресурса в реализации IDisposable, но все таки можно попробовать вызывать явно
Посмотри также на значение CloseTimeout...
DШ>может потому что ShutDown для сокета client явно не вызываешь? хотя он должен вызываться в момент освобождения ресурса в реализации IDisposable, но все таки можно попробовать вызывать явно DШ>Посмотри также на значение CloseTimeout...
ShutDown не помогает.
CloseTimeout попробую сейчас...
Re[2]: Проблемы с TcpClient
От:
Аноним
Дата:
22.09.10 11:28
Оценка:
DШ>Посмотри также на значение CloseTimeout...
Не нашел такого свойства, где искать нужно?
DШ>>может потому что ShutDown для сокета client явно не вызываешь? хотя он должен вызываться в момент освобождения ресурса в реализации IDisposable, но все таки можно попробовать вызывать явно DШ>>Посмотри также на значение CloseTimeout... А>ShutDown не помогает. А>CloseTimeout попробую сейчас...
приведи полный код, возникло стойкое ощущение что до вызова dispose у тебя дело не доходит и переменная client продолжает жить своей жизнью...
вынеси client до while и проведи эксперимент так сказать в лоб:
sock = new Socket(....);
sock.Bind;
while(...)
{
client = sock.Accept()
client = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
ps:
сам процесс создания tcpclient кажется в приведенном тобой примере выглядит кривым, используй уж тогда TcpListener и его методы вместо переназначения полученного клиентского сокета объекту класса TcpClient
Re[4]: Проблемы с TcpClient
От:
Аноним
Дата:
23.09.10 04:48
Оценка:
Да, проблема действительно в способе создания TcpClient'a, хотя судя по MSDN он разрешен... Ладно, буду помнить.
Спасибо за помощь!