Также, если вы хотите сделать построчную обработку процесса, ожидая ограниченное время, BeginGetContext возвращает System.IAsyncResult, открывающий свойство AsyncWaitHandle
var context = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
context.AsyncWaitHandle.WaitOne();
Выше блокирует поток, пока слушатель не получит что-то действительноекак определено хедерами, назначенными слушателю или завершается из-за некоторого исключения, которое завершает поток слушателя и возвращает результат обратно в ListenerCallback.
Но AsyncWaitHandle.WaitOne () может принимать параметры времени ожидания
// 5 seconds timeout
bool success = context.AsyncWaitHandle.WaitOne(5000, true);
if (success == false)
{
throw new Exception("Timeout waiting for http request.");
}
ListenerCallback может содержать вызов listener.EndGetContext или просто вызвать listener.EndGetContext в строке, если AsyncWaitHandle не указывает ни таймаут, ни ошибка
public static void ListenerCallback(IAsyncResult result)
{
HttpListener listener = (HttpListener) result.AsyncState;
// Use EndGetContext to complete the asynchronous operation.
HttpListenerContext context = listener.EndGetContext(result);
HttpListenerRequest request = context.Request;
// Get response object.
HttpListenerResponse response = context.Response;
// Construct a response.
string responseString = "<HTML><BODY> It Works!</BODY></HTML>";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
// Write to response stream.
response.ContentLength64 = buffer.Length;
System.IO.Stream output = response.OutputStream;
output.Write(buffer,0,buffer.Length);
// Close the output stream.
output.Close();
}
Не забудьте сказать слушателю прослушать сноваиспользуя listener.BeginGetContext