2011-12-30 22 views
4

私は1台のサーバーを監視するために永遠に実行する必要のあるサービスを持っています。そうするためには、私は5つのタスクをサービスで行う必要があります(現時点では5つ、数百になるでしょう)。OutOfMemory Exception C#スレッドを扱うとき

私は最大5スレッドのスレッドプールを作成しました。タスクを取得するためにスレッドが使用するキューがあり、各スレッドはそのタスクを処理してから再びエンキューします。キューには5つの小さい属性を持つオブジェクトが含まれています。

サービスは、私がこれを実行する行で、私はOutOfMemoryException例外を取得し、しばらくの間実行後:

ThreadPool.QueueUserWorkItem(currentJob.ProcessJob, (object)timeToWwait); 

timeToWwaitがintであり、私はもうそれを使用しないでください。

コンテキストは、このようなものです:

 ThreadPool.SetMinThreads(0, 0); 
     ThreadPool.SetMaxThreads(5, 5); 
     while (true) 
     { 
      bool processJob = false; 
      bool checkedFrontEnd = false; 
      _qLock.EnterWriteLock(); 
      try 
      { 
       if (_jobQueue.Count > 0) 
       { 
        currentJob = _jobQueue.Dequeue(); 
        // currentJob.IsActive = true; 
        // processJob = true; 
       } 
      } 
      finally 
      { 
       _qLock.ExitWriteLock(); 
      } 
      ThreadPool.QueueUserWorkItem(currentJob.ProcessJob, (object)timeToWwait); 
      //currentJob.ProcessJob((object)timeToWwait); 


      _qLock.EnterWriteLock(); 
      try 
      { 
       _jobQueue.Enqueue(currentJob); 
      } 
      finally 
      { 
       _qLock.ExitWriteLock(); 
      } 

あなたはどんな提案を持っていますしてください?

+1

あなたの質問にあなたのタイトルとタグの署名を含めることについてのFAQを参照してください。私はそれを2回修正しましたが、2人の担当者はそれをやり直す価値はありません。 –

答えて

1

ジョブを処理しているスレッドが完了した後で初めてジョブを(ジョブのキューに)エンキューすることができます。プール内にスレッドが1つしかなく、jobQueueに1つのジョブがあるとします。ジョブが長時間実行されている場合、コードはThreadPool.QueueUserWorkItemを同じジョブで何度も実行します。また、jobQueue内にジョブがあった場合は、ThreadPool.QueueUserWorkItemを実行したいだけです(上のコードからは関係なく実行されるように見えます)。面白い質問をありがとう。

+0

私の問題に興味を持っていただきありがとうございます。あなたが正しいです。これは本当に私の問題を解決しています...最後に。非常に役立ちます。 – Adn11

2

問題は、バックグラウンドタスクが完了する前にcurrentJobインスタンスをエンキューしていることです。

 ThreadPool.QueueUserWorkItem((state) => 
             { 
              currentJob.ProcessJob(); 
              _qLock.EnterWriteLock(); 
              try 
              { 
               _jobQueue.Enqueue(currentJob); 
              } 
              finally 
              { 
               _qLock.ExitWriteLock(); 
              } 

             } 
      ); 
+0

本当にありがとうございました。これは本当に私の問題を解決し、あなたの提案に感謝します。私はこのアプローチを使用します。私はちょうど新しいデザインを考えていて、あなたの答えは非常に役立つようになった。 – Adn11

関連する問題