none
Http Сервер. Вопросы по потокам. RRS feed

  • Вопрос

  • Здравствуйте.

    Делаю Http сервер. На форме две кнопки "Старт" и "Стоп". Создал класс ServerListener. В нем создаю два потока. Один поток ClientListener служит для обработки запросов. Второй поток TestCourse служит для запуска необходимых методов (извиняюсь если не понятно. Суть не в этом). Когда форма создается вызывается StartListener. 

            // Создаем прослушивателя
            HttpListener listener = new HttpListener();
            
            Thread threadListener;
            Thread threadEvaluateCourse;
    
            ManualResetEvent manualEvent = new ManualResetEvent(false);
    
            ManualResetEvent manualEventForTestCourse = new ManualResetEvent(false);
    
     public void StartListener()
            {
                listener.Start();
                listener.Prefixes.Add("http://localhost:9999/");
    
                threadListener = new Thread(new ThreadStart(ClientListener));
    
                threadEvaluateCourse = new Thread(new ThreadStart(TestCourse));
    
                threadListener.Start();
                threadEvaluateCourse.Start();
                StartServer();
            }
    
            /// <summary>
            /// Метод потока. Производит обработку запросов от клиента.
            /// </summary>
            private void ClientListener()
            {
                
                //statusServer = "Сервер запущен";
                while (manualEvent.WaitOne())
                {
                    statusServer = "Сервер запущен";
                    HttpListenerContext context = listener.GetContext();
                    HttpListenerRequest request = context.Request;
                }
    
            }
    
            /// <summary>
            /// 
            /// </summary>
            private void TestCourse()
            {
    
                while (manualEventForTestCourse.WaitOne())
                {
                    
                }
                
            }
    
            public void StartServer()
            {
                statusServer = "Сервер запущен";
                manualEvent.Set();
                manualEventForTestCourse.Set();
            }
    
            public void StopServer()
            {
                statusServer = "Сервер остановлен";
                manualEvent.Reset();
                manualEventForTestCourse.Reset();
            }

    Вопросы:

    1. При закрытии формы потоки остаются. Как их завершить ? Пробовал вот так.

                threadListener.Join();
                threadEvaluateCourse.Join();
                listener.Stop();

    2. Как можно еще приостанавливать потоки не используя ManualResetEvent ?

    3. Если можно подскажите правильная ли реализация "архитектуры" сервера ?

    12 апреля 2013 г. 13:37

Ответы

  • Уже понятно. Дело в том, что поток в котором вы запускаете HttpListener является потоком переднего плана (foreground threads), который не завершится даже после завершения основного потока приложения при закрытии формы. Сделайте его фоновым, установив свойство

    IsBackground = true; 
    и тогда он автоматически завершится, при закрытии приложения.

    • Помечено в качестве ответа Кирилл88 15 апреля 2013 г. 7:04
    13 апреля 2013 г. 13:29
    Модератор

Все ответы

  • А где хостятся ваши потоки, в каком процессе?
    12 апреля 2013 г. 15:24
    Модератор
  • А где хостятся ваши потоки, в каком процессе?
      Форма создается и в ее конструкторе я вызываю метод StartListener. Наверное в потоке формы насколько я понимаю.
    13 апреля 2013 г. 5:27
  • Уже понятно. Дело в том, что поток в котором вы запускаете HttpListener является потоком переднего плана (foreground threads), который не завершится даже после завершения основного потока приложения при закрытии формы. Сделайте его фоновым, установив свойство

    IsBackground = true; 
    и тогда он автоматически завершится, при закрытии приложения.

    • Помечено в качестве ответа Кирилл88 15 апреля 2013 г. 7:04
    13 апреля 2013 г. 13:29
    Модератор
  • Спасибо за помощь. Вроде работает.

    P.S.

    А я думал, что если в конструкторе формы вызываю создание потока, то главный поток - это форма, а дочерний HttpListener.

    15 апреля 2013 г. 7:04
  • "А я думал, что если в конструкторе формы вызываю создание потока, то главный поток - это форма, а дочерний HttpListener." - это главный поток(первичный), но так же являющийся foreground thread.
    16 апреля 2013 г. 18:07
    Модератор