Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Завершение работы асинхронного http-сервера


Автор: Lamya 22.11.2011, 14:46
Есть асинхронный http-сервер.

Код

HttpListener listener = new HttpListener();
            listener.Prefixes.Add(...);
            listener.Start();
            for (int i = 0; i < 20; i++)
            {
                listener.BeginGetContext(new AsyncCallback(GetContextCallback), listener);
            }
            Console.ReadKey();
            lock (new object())
            {
                terminated = true;
            }
            listener.Stop();
            listener.Close();


Код

private static void GetContextCallback(IAsyncResult result)
        {
            // Note: The GetContext method blocks while waiting for a request. 
            HttpListener listener = (HttpListener)result.AsyncState;
            if (listener.IsListening)
            {
                HttpListenerContext context = listener.EndGetContext(result);
                HttpListenerRequest request = context.Request;
                Stream body = request.InputStream;
                Encoding encoding = request.ContentEncoding;
                StreamReader reader = new StreamReader(body, encoding);
                string data = reader.ReadToEnd();
                /// обработка 

                    if (!terminated)
                    {
                        listener.BeginGetContext(new AsyncCallback(GetContextCallback), listener);
                    }
            }
        }


Как видно, после обработки принятого пакета снова запускается асинхронный прием. Вопрос в следующем: когда я останавливаю сервер, нужно вызвать Stop для каждого из 20 запущенных BeginGetContext, предварительно сохранив их IAsyncResult в массиве, или достаточно только для главного listener? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)