Я написал HttpListener
, который прослушивает один из портов:
httpListener.BeginGetContext(new AsyncCallback(ListenerCallback), httpListener);
ListenerCallback
обрабатывает любой запрос, полученный на uri-получателя. Если исключение возникает во время запроса обработки, оно запускает процедуру диагностики, которая пытается атаковать прослушиватель uri, чтобы проверить, действительно ли слушатель жив и прослушивает uri, и записывает журнал ответа, возвращаемого слушателем. Listener просто возвращает строку Listening...
к таким фиктивным запросам.
Теперь во время тестирования, когда исключение произошло в других модулях, которые привели к выполнению диагностических модулей, я могу видеть, как слушатель вернул Listening...
правильно, когда я проверил журналы.
Однако, когда исключение произошло в ListenerCallback
, попытка ударить URI-получателя внутри диагностики привела к следующему исключению:
System.Net.WebException : The operation has timed out
at System.Net.HttpWebRequest.GetResponse()
at MyPackage.Diagnostics.hitListenerUrl(String url) in c:\SW\MyApp\MyProj\Diagnostics.cs:line 190
Эта строка 190 в диагностическом модуле выглядит следующим образом:
189 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
190 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Теперь, если AsyncCallback
отправляет новый поток и запускает ListenerCallback
в этом новом потоке, он не должен вызывать Operation Timeout
, когда фиктивный запрос отправляется через диагностику. Это то, что я думал, что желаемое поведение должно быть, так как оно *Async*Callback
. На самом деле MSDN также говорит то же:
Используйте делегат AsyncCallback для обработки результатов асинхронной операции в отдельном потоке.
Но, похоже, это не так. Я что-то упустил?
Интерпретация визуально: