2009-08-31 18 views
0

私は無限ループとthread.sleepを利用するWindowsサービスを持っています。スレッドのスリープ時間は10秒です。VB.net Windowsサービスの応答時間

サービスが最初に開始され、(SQLにデータが存在する)処理が行われると、サービスはすぐに処理されます。それはを行う仕事がある限り、応答性があり、10秒ごとに処理タスクを続けます。長期間(つまり15-20分)SQLにデータが存在しない場合、サービスは非常にゆっくりと応答し始めます。それは最終的にデータを選択して処理しますが、10秒ではなく10分になります。

サービスにスリープ状態を知らせるロジックはありません。何か案は?

+1

何が起こっているかを見るためにコードスニペットを投稿する機会はありますか? – twlichty

答えて

0

コードを見ることなく、決定的な回答をすることは不可能です。データベースの接続をすばやく整理しているわけではない場合は、となります。

次のような何かをしている場合:

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 

これらは、その後、SqlDataReaderDispose()を呼び出します、SqlConnectionそしてSqlCommand - 最初の2つのどちらかで接続プールに接続が解放されます(これはSqlDataReaderにあり、終了時にはCloseConnectionになります)

0

これはRowlandと完全に同意します1。コードを見ることなく、決定するのは難しいだろうが、おそらく最も一般的なのはあなたのdbコードだ。