2011-06-24 46 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