<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414372&amp;view=findpost&amp;p=3792056</guid>
        <pubDate>Wed, 06 Mar 2019 22:17:21 +0000</pubDate>
        <title>Можно ли отложить вход в спящий режим?</title>
        <link>https://forum.sources.ru/index.php?showtopic=414372&amp;view=findpost&amp;p=3792056</link>
        <description><![CDATA[Макс1: Есть сервер, который некорректно отслеживает закрытие соединения. Сокет на устройстве, к которому происходит подключение, перестает отвечать на запросы, если была попытка закрыть соединение при обрыве связи по сети. Изменить поведение устройства возможности нет.<br>
<a class='tag-url' href='https://forum.sources.ru/index.php?showtopic=414289' target='_blank'>После обрыва связи и повторного соединения сокет не отвечает на сообщения</a><br>
Служба Windows мониторит это устройство по сети. Также есть приложение, которое вводит компьютер в спящий режим и выводит из него в определенное время.<br>
При вызове метода StopThreads при получении сообщения о входе в спящий режим пытаюсь закрыть соединение, а при выходе из спящего режима запускаю соединение снова в методе StartThreads. Поток быстро завершается, о чем происходит запись в логах, при закрытии соединения ошибок в логах нет. Но, похоже, Windows быстро обрубает сетевые соединения при входе в спящий режим, и соединение не успевает корректно закрыться. После открытия соединения сокет не отвечает на запросы. Если не отслеживать спящий режим, сокет также не отвечает на запросы после выхода из спящего режима.<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (powerStatus.HasFlag(PowerBroadcastStatus.QuerySuspend))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;StopThreads(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (powerStatus.HasFlag(PowerBroadcastStatus.ResumeSuspend))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;StartThreads();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return base.OnPowerEvent(powerStatus);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Пытаюсь использовать функцию SetThreadExecutionState.<br>
<a class='tag-url' href='https://stackoverflow.com/questions/16593100/what-is-the-proper-way-to-have-a-windows-service-stop-and-start-gracefully-when' target='_blank'>https://stackoverflow.com/questions/1659310...gracefully-when</a><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">SetThreadExecutionState(EXECUTION_STATE.ES_AWAYMODE_REQUIRED |</div><div class="code_line">EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_SYSTEM_REQUIRED |</div><div class="code_line">EXECUTION_STATE.ES_CONTINUOUS);</div></ol></div></div></div></div><br>
Она работает только, если вызвать ее до входа в спящий режим, и частично блокирует вход в спящий режим. Гаснет монитор, но не закрываются сетевые соединения. Метод OnPowerEvent в этом случае не получает сообщений о входе в спящий режим и выходе из него. Если вызвать функцию SetThreadExecutionState после получения сообщения QuerySuspend, она не блокирует вход в спящий режим. Кроме того, сообщалось, что функция SetThreadExecutionState не работает на Windows 10. Есть ли способ не блокировать, а отложить вход в спящий режим на несколько секунд, и не до, а после сообщения QuerySuspend, чтобы служба успела корректно закрыть соединение?<br>
Другой вариант - можно ли сделать так, чтобы служба не пыталась закрыть соединение при входе в спящий режим. Если не закрывать соединение при обрыве связи, связь затем восстанавливается. Если во время обрыва связи была попытка закрытия соединения или был выход из приложения, сокет после восстановления связи не отвечает на запросы. В приложении, которое вводит компьютер в спящий режим, можно предусмотреть, чтобы оно сообщало службе об этом за несколько секунд до входа в спящий режим. Но есть ли способ сделать это средствами самой службы?]]></description>
        <author>Макс1</author>
        <category>.NET: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	