Как можно отменить синхронный запрос WinHttp? - PullRequest
2 голосов
/ 20 января 2012

У моей службы есть поток, который потенциально может выполнять WinHttpSendRequest, когда кто-то пытается остановить мою службу.

В документации WinHttpCloseHandle написано:

Приложение может прервать выполняющийся синхронный или асинхронный запрос, закрыв дескриптор запроса HINTERNET, используя WinHttpCloseHandle

Но позже эта же документация, похоже, противоречит этому.В нем говорится:

Приложение никогда не должно WinHttpCloseHandle вызывать синхронный запрос.Это может создать условия гонки.

Я нашел этот пост , который, кажется, согласен, я не могу позвонить WinHttpCloseHandle.

I 'Мне интересно, как я могу отменить эту операцию, чтобы моя служба могла быть остановлена ​​изящно?Я не могу дождаться истечения времени ожидания WinHttpSendRequest, потому что это занимает слишком много времени, и мое обслуживание не останавливается достаточно быстро.Я думаю, что Windows сообщает об этом как об ошибке, а затем принудительно убивает службу при завершении работы.

Идея будет оценена.

1 Ответ

0 голосов
/ 20 января 2012

Вызов WinHttpCloseHandle из фонового потока для принудительного закрытия дескриптора, возможно, не лучшее решение. Тем не менее, это работает, и исходный вызывающий абонент получит что-то вроде кода ошибки «плохой дескриптор», и запрос будет принудительно завершен.

Возможно, было бы небезопасно злоупотреблять этой властью, и вместо этого лучше было бы реализовать асинхронные запросы. Тем не менее, в случае закрытия устаревшего сервиса он будет работать нормально.

...