Время ответа службы Windows VB.net - PullRequest
0 голосов
/ 31 августа 2009

У меня есть служба Windows, которая использует бесконечный цикл и thread.sleep. Время ожидания потока составляет 10 секунд.

Когда служба изначально запускается и имеет работу (данные существуют в SQL), она немедленно выполняет свои процессы. Он продолжает реагировать и обрабатывать задачи каждые 10 секунд , пока у него есть работа для выполнения . Если в течение длительного периода (например, 15-20 минут) в SQL нет данных, служба начинает реагировать очень медленно. В конечном итоге данные будут собраны и обработаны, но это займет больше 10 минут вместо 10 секунд.

Нет логики в коде, сообщающем службе, что она спит. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2009

Полностью согласен с Роулендом в этом. Не видя код, его будет трудно определить, но наиболее вероятным виновником является ваш код БД.

0 голосов
/ 09 сентября 2009

Не видя ваш код, невозможно дать однозначный ответ; может иметь место в том случае, если вы недостаточно быстро приводите в порядок соединения с базой данных.

Если у вас есть что-то вроде:

   While( True )
      Dim con as new SqlConnection(connectionString)
      con.Open()

      Dim cmd as New SqlCommand("usp_getJob", con)
      cmd.CommandType = CommandType.StoredProcedure

      Dim dr as SqlDataReader = cmd.ExecuteReader(CommandBehavior.SingleResult Or CommandBehavior.SingleRow Or CommandBehavior.CloseConnection)
      If( dr.Read() )
          DoSomething(dr)
      Else
          Thread.Sleep(10)
      End If
   End While

... тогда он откроет соединения быстрее, чем они сами исчезнут.

Существует несколько альтернатив, и я бы рекомендовал использовать блоки Using, чтобы максимально быстро вернуть соединение в пул соединений:

   While( True )
      Using con as new SqlConnection(connectionString)
          con.Open()

          Using cmd as New SqlCommand("usp_getJob", con)
            cmd.CommandType = CommandType.StoredProcedure

            Using dr as SqlDataReader = cmd.ExecuteReader(CommandBehavior.SingleResult Or CommandBehavior.SingleRow Or CommandBehavior.CloseConnection)
                If( dr.Read() )
                    DoSomething(dr)
                    dr.Close()
                Else
                    Thread.Sleep(10)
                End If
             End Using
          End Using
      End Using
   End While

Затем они вызовут Dispose() для SqlDataReader, SqlConnection и SqlCommand - любой из первых двух вызовет сброс соединения в пул соединений (учитывая, что мы спросили SqlDataReader до CloseConnection при его закрытии)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...