BeginInvoke-подводные камни?
От: Dimetrius Украина  
Дата: 12.03.07 15:49
Оценка:
Здравствуйте!
надеюсь поможете с решением слудующей проблемы!

2 процесса обмениваются данными через порт! сервер в отдельном потоке запускает процедуру ожидания новых соединений и каждый раз, когда новое соединение установлено, асинхронно вызывает делегат _ConnectionResieved для обработки этого соединения! этот делегат-всего лишь пара операторов(то есть выполняется он совсем недолго), которые однако нельзя внести в сам цикл ожидания соединения! Это операторы асинхронного запуска соединений на прослушивание(через TcpClient.GetStream().BeginRead()) и еще несколько мелких действий
Так вот-проблема! сначал все работает нормально... сервер принимает несколько подключений(2 например-в моем тестовом примере)! эти соединения устанавливаются на прослушивание, по ним идет обмен данными с клиентами! после этого еще один клиент хочет установить соединение с сервером-соединение устанавливается... однако _ConnectionResieved.BeginInvoke просто не выполняется
не могу понять в чем дело

Цикл ожидания новых соединений на сервере(в отдельном потоке)
private void ListenThreadProc()
        {
              _tcpListener = new TcpListener(System.Net.IPAddress.Any, _port);
              _tcpListener.Start();


                _flag = true;
                do
                { 
                    Console.WriteLine("Жду новое соединение...");
                   //жду нового соединения
                    ClientConnection cc = new ClientConnection(_tcpListener.AcceptTcpClient(), Guid.NewGuid().ToString());

                   Console.WriteLine("Новое соединение открыто...");
                    
                    //асинхронно вызываю делегат обработки нового соединения, т.е. запуск его на прослушивание, сохранение ссылки на
                    //ClientConnection во внутренних структурах приложения
                    //асинхронный вызов этого делегата через время перестает выполняться
                   _ConnectionResieved.BeginInvoke(cc, new AsyncCallback(OnEndRead), _ConnectionResieved);

                } while (_flag);
                _tcpListener.Stop();

            }
           
        }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.