2011-06-24 43 views
2

我正在寫一個由定時器啓動的windows服務,並且每分鐘都會耗費一些時間。我想限制沒有。一次運行的服務實例數量爲100.我該怎麼做?任何想法?限制no。 Windows服務中的實例

編輯:我想限制沒有。由定時器啓動的線程。

+0

您不能擁有多個Windows服務實例嗎?除非你故意這樣做:http://www.codeproject.com/KB/dotnet/MultipleInstNetWinService.aspx? –

+0

這是一個XY問題。不要問你的解決方案,告訴我們問題是什麼? –

回答

0

這聽起來像一個非常糟糕的設計 - 和一個內存/ cpu豬。我不確定當你說100個Windows服務時,我理解你的意思 - 因爲服務是一項服務。至少在具有獨特服務的意義上說。你是否通過任務管理器啓動了100個隱藏在後臺運行的應用程序?如果是這樣的話,你可以通過創建一個真正的Windows服務並使用該服務中的邏輯來控制應用程序的流程(以及運行代碼的多個實例的執行)來實現更好的效果。

例如,你可以有一個主服務,其中一個主線程可以睡n個。秒,然後執行。主線程喚醒後,它將負責分離新線程。例如,您可以使用線程池,而您可以控制活動的線程數。您的主線程將檢查線程池以確定它是否已達到容量,並且如果有效,請關閉一個新線程。

Main Service Thread 
> Sleep n. seconds 
    > ThreadPool < 100? 
    > New Thread 
+0

我想我把這個方法弄錯了。我糾正了我的問題。 – Dnana

1

如果您使用System.Threading.ThreadPool,有一個名爲SetMaxThreads功能,您可以控制同時運行的線程的最大數量。另外,請記下該頁面上有關更改併發線程數的說明。

0

此代碼演示您需要什麼。

只要使用theSmaphoreSlim(與信號量相同,性能更好)的對象來做到這一點。

想想信號量是一個計數器。每次你等待計數器下降一個數字。在操作結束時需要釋放它。

當計數器爲0時,無法獲得信號燈。

關於ThreadPool的建議,我不認爲這是一個好主意,因爲線程池在應用程序的許多部分中使用,而不僅僅是這一個。

class Program 
    { 
     private static SemaphoreSlim threadsSemaphore = new SemaphoreSlim(5, 5); 

     static void Main(string[] args) 
     { 
      Timer timer = new Timer(DoSomeWork, null, 0, 100); 

      Console.ReadKey(); 
     } 

     private static void DoSomeWork(object state) 
     { 
      if (threadsSemaphore.Wait(TimeSpan.FromSeconds(1))) 
      { 
       try 
       { 
        Console.WriteLine("Doing work ..."); 
        Thread.Sleep(1000); 
       } 
       finally 
       { 
        threadsSemaphore.Release(); 
       } 
      } 
      else 
      { 
       Console.WriteLine("Skipping work", threadsSemaphore.CurrentCount); 
      } 


     } 
    } 
+0

我會試試看。 – Dnana