[C#] Сокеты и нити
Берут нить(поток/тред) из пула потоков - и выполняет в нем переданный делегат.
> как закрыть тогда сокет
попробуй Dispose
'System.Net.Sockets.Socket.Dispose(bool)' is inaccessible due to its protection level
>Берут нить(поток/тред) из пула потоков - и выполняет в нем переданный делегат.
эта нить при этом создается наподобие fork или она уже есть в этом пуле?
когда делегат завершит работу нить кончается или что с ней происходит?
и вроде остается
тебе нужен, который просто Dispose, без параметров
> эта нить при этом создается наподобие fork или она уже есть в этом пуле?
уже создана
> когда делегат завершит работу нить кончается или что с ней происходит?
возвращается обратно в пул
так и вызываю, "sock.Dispose;" , выходит эта ошибка
может сокет другой?
IDisposable)socket).Dispose;
В msdn есть пример работы с асинхронными сокетами (BeginAccept / EndAccept, если мне память не изменяет). Думается, что этот пример решит твою проблему.
An unhandled exception of type 'System.Net.Sockets.SocketException' occurred in system.dll
Additional information: A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied
да, пытался, но в этом случае Close тоже вызывает исключение то же самое причем
Ты уверен, что это исключение возникает во время закрытия сокета, а не во время других операций?
thread - есть свой стек (следовательно не статические переменные не являются общими для всех потоков) при обращении к статическим данным надо проявлять осторожность: использовать семафоры, mutex, lock (в C#) это самый обычной способ сделать многопоточное приложение здесь наибольшая скорость передачи данных между выполняющимися потоками: (залочил.записал.отлочил). довольно часто используется 2-х поточная модель: 1)длительная обработка данных 2) пользовательский интерфейс (в простейшем случае кнопка выйти)
process - длительное переключение между процессами дядя Рихтер даже по-моему приводит в тактах что сколько приблизительно занимает. Что дает использование нескольких просессов: прежде всего это повышение устойчивости програмной системы: программа может состоять из 2-частей: стабильный просесс, обрабатывающий данные, и графический интерфейс с глючной библиотекой: при смерти родительского процесса детей обычно не давят.
если имеется в виду unix fork то последний должен при вызове полностью скопировать память и сделать точною копию процесса (за исключением переменной, которую надо вернуть)
pooling: если создание и удаление занимает много времени, то мы создаем сразу штук 20 и не удаляем относится к дескрипторам файлов, соединениям с базой данных, потокам и др.
Неблокирующие вызовы для работы с сокетами и файлами: обычно сценарий: запустить операцию, сделать свое дело, спать пока операция не закончится
если тебе надо сокет для listen то см. msdn:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconUsingNon-BlockingServerSocket.asp
если для клиетна, то зачем создавать и удалять много сокетов?
З.Ы. каждый программист на VB 6.0 должен знать WinApi
если убрать этот вызов, получается такое исключение, уже из-за Close, но в другой нити, которая ждет подключения клиента - после вызова CLose, я так понимаю во время вызова "s.EndAccept(ar);" :
An unhandled exception of type 'System.InvalidOperationException' occurred in system.dll
Additional information: AcceptCallback
Может быть стоит перед тем как закрывать сокет проверить, есть ли хоть одно клиентское подключение, и если нет, то Close не вызывать?
но как это сделать найти не могу
у тебя выше приведеннй msdn'новский пример не работает?
каждый программист на VB 6.0 должен знать WinApiНе только должен, но и вынужден
попробовал, но снова после listener.Close; во второй слушающей нити выкидывается то же исключение :
An unhandled exception of type 'System.InvalidOperationException' occurred in system.dll
Additional information: AcceptCallback
как заставить сокет прекратить слушать?
особенно если нет еще клиентских подключений
Вот, рекомендую программку: http://www.aisto.com/roeder/dotnet/Download.aspx?File=Reflector
блин мне срочно надо а не для удовольствия поиска
что это за прога? безопасно ее запускать-то?
вполне... переводит сборки в нет-овские языки (c#, например включая системный. Можешь легко посмотреть что нужный тебе класс использует и с какими параметрами вызывает
типа скомпиленный код переводит обратно в язык высокого уровня?
то есть можно код системных библиотек смотреть похоже
как заставить сокет прекратить слушать?
да, причем там довольно удобная навигация по коду
а если не поможет -
try
{
socket.Close;
}
catch(SocketException ex) {}
да, пробовал, в слушающей нити после этого ведь еще происходят попытки принять данные, и снова исключение :
An unhandled exception of type 'System.Net.Sockets.SocketException' occurred in system.dll
Additional information: A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied
может попробовать эту слушающую нить прибить?
Вот что из System.Net.Sockets.Socket выковырял:
public void Close
{
IDisposable) this).Dispose;
}
да, я тоже на это наткнулся хе хе
лучше ловить исключение. Если ты прибьешь поток - то все равно вызовется тот же Dispose, только исключение ты уже не увидишь.
эта нить ... уже созданаЭто так и есть, но честно говоря какое-то стремное решение... Если пул весь израсходован, можно было бы заводить новые треды, но этот самый ThreadPool вместо этого ждет, когда старые завершатся. Так же в дэдлок можно угодить, то есть треды, исполняющиеся сейчас, будут ждать тредов из очереди, а те никогда не начнутся. Или я чего-то гоню?
не делай так (c)
ThreadPool - предназначен для выполнения коротких операций в отдельных потоках.
> Так же в дэдлок можно угодить, то есть треды, исполняющиеся сейчас, будут ждать тредов из очереди, а те никогда не начнутся. Или я чего-то гоню?
Для таких операций необходимо использовать свои потоки, а не потоки из ThreadPool.
я в сокетах не бум-бум, но может там асинхронные вызовы спасут от создания потоков (а уже про это писали )
что такое свои потоки?
ну берешь и запускаешь на каждый конект или что у тебя отдельный поток, который сам ручками создаешь и запускаешь (а не из пула берешь)
Thread thread = new Thread(..);
thread.Start;
Оставить комментарий
Eugenia_2005
1) что такое нить, в с мысле чем она отличается от параллельных процессов и что делает ThreadPool.QueueUserWorkItem(new WaitCallback(... чем отличается от forkсправку мсднную читал и не нашел этих вещей
2) нужно ожидать подключения от клиента и при этом чтобы не висло приложение (как это от блокирующего Accept'а)
- если сделать это другой нити (после ThreadPool.QueueUserWorkItem то как закрыть тогда сокет пока он в Accept'е? socket.close выдает исключение если не было ни одного подключения
- если сделать сокет неблокирующим ( socket.Blocking = false; то close в главной нити тоже выдает исключение по поводу "A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied"