2012-01-20 5 views
2

У моего сервиса есть поток, который потенциально может выполнять WinHttpSendRequest, когда кто-то пытается остановить мой сервис.Как можно аннулировать синхронный запрос WinHttp?

WinHttpCloseHandle documentation говорит:

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

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

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

Я нашел this blog post, что, кажется, согласен, я не могу позвонить WinHttpCloseHandle.

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

Идеи были бы оценены.

ответ

0

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

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