Есть асинхронный 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?
|