Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2012, 22:13   #1
bondik
Форумчанин
 
Регистрация: 24.04.2008
Сообщений: 300
По умолчанию Запуск не static класса в отдельном потоке

Небольшой много поточный TCP сервер:
Код:
 class Server
    {
        TcpListener Listener; // Объект, принимающий TCP-клиентов

        // Запуск сервера
        public Server(int Port)
        {
            Listener = new TcpListener(IPAddress.Any, Port); // Создаем "слушателя" для указанного порта
            Listener.Start(); // Запускаем его

            // В бесконечном цикле
            while (true)
            {
                
                // Принимаем нового клиента
                TcpClient Client = Listener.AcceptTcpClient();
                // Создаем поток
                Thread Thread = new Thread(new ParameterizedThreadStart(ClientThread));
                // И запускаем этот поток, передавая ему принятого клиента
                Thread.Start(Client);
                
            }
        }

      

        static void ClientThread(Object StateInfo)
        {
            // Просто создаем новый экземпляр класса Client и передаем ему приведенный к классу TcpClient объект StateInfo
            new Client((TcpClient)StateInfo);
        }

        // Остановка сервера
        ~Server()
        {
            // Если "слушатель" был создан
            if (Listener != null)
            {
                // Остановим его
                Listener.Stop();
            }
        }

        static void Main(string[] args)
        {
           
            
            new Server(80);
            Console.WriteLine("Пиздец");
            
        }
Узкое место бесконечный цикл. Вижу 2 варианта:
1)Запустить класс сервер в отдельном потоке ( не получается, так как класс статик)
2)Место с бесконечным циклом вынести в отдельный метод и запустить в новом потоке в конструкторе класса ( не получается, так как TcpListener тоже статик)

Подскажите пожалуйста как решить проблему.
bondik вне форума Ответить с цитированием
Старый 04.03.2012, 23:10   #2
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Сделайте класс нестатичным и наследуемым от IDisposable и освобождайте занимаемую им память при необходимости самостоятельно.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 04.03.2012, 23:30   #3
bondik
Форумчанин
 
Регистрация: 24.04.2008
Сообщений: 300
По умолчанию

Спасибо большое за ответ.Но не могли бы вы кодом показать, я честно говоря с потоками мало сталкивался,от того такие глупые вопросы.
bondik вне форума Ответить с цитированием
Старый 05.03.2012, 05:34   #4
Adyvan
Пользователь
 
Регистрация: 15.01.2011
Сообщений: 24
По умолчанию

А зачем тебе бесконечный цикл??? (если перебор с потоками то прога еще дольше работает, чем с одним!)
Напиши формулировку задачи?
Adyvan вне форума Ответить с цитированием
Старый 05.03.2012, 14:13   #5
bondik
Форумчанин
 
Регистрация: 24.04.2008
Сообщений: 300
По умолчанию

Формулировка :
Создаем слушателя,если коннект есть,то для коннекта создаем класс клиент и запускаем клиента в отдельном потоке ( простите за демагогию)
Сообственно решил так:
Код:
class Server
    {
        Thread ThreadStart;
        TcpListener Listener; // Объект, принимающий TCP-клиентов
        int Port;
        // Запуск сервера
        public Server(int Port1)
        {
            Port = Port1;
        }

        public void start()
        {
            Listener = new TcpListener(IPAddress.Any, Port); // Создаем "слушателя" для указанного порта
            ThreadStart = new Thread(new ThreadStart(Listen));
            ThreadStart.Start();

            
        }

        private void Listen()
        {
            Listener.Start(); // Запускаем его

            // В бесконечном цикле
            while (true)
            {


                
                // Принимаем нового клиента
                TcpClient Client = Listener.AcceptTcpClient();
                // Создаем поток
                Thread Thread = new Thread(new ParameterizedThreadStart(ClientThread));
                // И запускаем этот поток, передавая ему принятого клиента
                Thread.Start(Client);

            }
        }
        static void ClientThread(Object StateInfo)
        {
            // Просто создаем новый экземпляр класса Client и передаем ему приведенный к классу TcpClient объект StateInfo
            new Client((TcpClient)StateInfo);
        }

        // Остановка сервера
        ~Server()
        {
            // Если "слушатель" был создан
            if (Listener != null)
            {
                // Остановим его
                Listener.Stop();
            }
        }

        static void Main(string[] args)
        {
           
            // Создадим новый сервер на порту 80
            Server a = new Server(17565);
            a.start();
            Console.ReadKey();
        }
    }
bondik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Показать прогресс в отдельном потоке? _SERGEYX_ Общие вопросы Delphi 1 04.03.2012 23:20
Запуск программы, помещённой в массив байт, в отдельном потоке RKT878 Общие вопросы Delphi 1 25.09.2011 22:12
Вызов ApplyUpdate в отдельном потоке crazyPr0ger БД в Delphi 1 24.07.2011 18:06
Загрузка в отдельном потоке Crystallon Общие вопросы Delphi 4 05.10.2010 15:15
всплывающее окно(в отдельном потоке) Virus191288 Компоненты Delphi 8 21.01.2010 13:41