На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Можно ли отложить вход в спящий режим? , из службы Windows на C#
    Есть сервер, который некорректно отслеживает закрытие соединения. Сокет на устройстве, к которому происходит подключение, перестает отвечать на запросы, если была попытка закрыть соединение при обрыве связи по сети. Изменить поведение устройства возможности нет.
    После обрыва связи и повторного соединения сокет не отвечает на сообщения
    Служба Windows мониторит это устройство по сети. Также есть приложение, которое вводит компьютер в спящий режим и выводит из него в определенное время.
    При вызове метода StopThreads при получении сообщения о входе в спящий режим пытаюсь закрыть соединение, а при выходе из спящего режима запускаю соединение снова в методе StartThreads. Поток быстро завершается, о чем происходит запись в логах, при закрытии соединения ошибок в логах нет. Но, похоже, Windows быстро обрубает сетевые соединения при входе в спящий режим, и соединение не успевает корректно закрыться. После открытия соединения сокет не отвечает на запросы. Если не отслеживать спящий режим, сокет также не отвечает на запросы после выхода из спящего режима.
    ExpandedWrap disabled
      protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
              {            
                  if (powerStatus.HasFlag(PowerBroadcastStatus.QuerySuspend))
                  {                
                      StopThreads();                
                  }          
                  if (powerStatus.HasFlag(PowerBroadcastStatus.ResumeSuspend))
                  {
                      StartThreads();
                  }
                  return base.OnPowerEvent(powerStatus);
              }

    Пытаюсь использовать функцию SetThreadExecutionState.
    https://stackoverflow.com/questions/1659310...gracefully-when
    ExpandedWrap disabled
      SetThreadExecutionState(EXECUTION_STATE.ES_AWAYMODE_REQUIRED |
      EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_SYSTEM_REQUIRED |
      EXECUTION_STATE.ES_CONTINUOUS);

    Она работает только, если вызвать ее до входа в спящий режим, и частично блокирует вход в спящий режим. Гаснет монитор, но не закрываются сетевые соединения. Метод OnPowerEvent в этом случае не получает сообщений о входе в спящий режим и выходе из него. Если вызвать функцию SetThreadExecutionState после получения сообщения QuerySuspend, она не блокирует вход в спящий режим. Кроме того, сообщалось, что функция SetThreadExecutionState не работает на Windows 10. Есть ли способ не блокировать, а отложить вход в спящий режим на несколько секунд, и не до, а после сообщения QuerySuspend, чтобы служба успела корректно закрыть соединение?
    Другой вариант - можно ли сделать так, чтобы служба не пыталась закрыть соединение при входе в спящий режим. Если не закрывать соединение при обрыве связи, связь затем восстанавливается. Если во время обрыва связи была попытка закрытия соединения или был выход из приложения, сокет после восстановления связи не отвечает на запросы. В приложении, которое вводит компьютер в спящий режим, можно предусмотреть, чтобы оно сообщало службе об этом за несколько секунд до входа в спящий режим. Но есть ли способ сделать это средствами самой службы?
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0250 ]   [ 16 queries used ]   [ Generated: 28.03.24, 19:55 GMT ]