C# 限制windows服务中的实例数

C# 限制windows服务中的实例数,c#,windows-services,C#,Windows Services,我正在编写一个由计时器启动的windows服务,它每分钟都在消耗时间。我想限制每次运行的服务实例的数量,比如说100个。我怎么能做到?有什么想法吗 编辑:我想限制计时器启动的线程数。这听起来像是一个非常糟糕的设计,而且占用内存/cpu。当你说100个windows服务时,我不确定我是否理解你的意思——因为一个服务就是一个服务。至少在拥有独特服务的意义上。您是否通过任务管理器启动了100个隐藏在后台运行的应用程序?如果是这样的话,您可以通过创建一个真正的windows服务并在该服务中使用逻辑来控制

我正在编写一个由计时器启动的windows服务,它每分钟都在消耗时间。我想限制每次运行的服务实例的数量,比如说100个。我怎么能做到?有什么想法吗


编辑:我想限制计时器启动的线程数。

这听起来像是一个非常糟糕的设计,而且占用内存/cpu。当你说100个windows服务时,我不确定我是否理解你的意思——因为一个服务就是一个服务。至少在拥有独特服务的意义上。您是否通过任务管理器启动了100个隐藏在后台运行的应用程序?如果是这样的话,您可以通过创建一个真正的windows服务并在该服务中使用逻辑来控制应用程序的流程(以及运行的代码的多个实例的执行),使其变得更好

例如,您可以有一个带有一个主线程的windows服务,该线程将休眠n。秒,然后执行。主线程唤醒后,它将负责剥离新线程。例如,您可以使用线程池,而可以控制活动线程的数量。您的主线程将检查线程池以确定它是否已达到容量,如果有效,则派生一个新线程

Main Service Thread
 > Sleep n. seconds
   > ThreadPool < 100?
     > New Thread
主服务线程
>睡眠。秒
>线程池<100?
>新线程

如果您使用的是
System.Threading.ThreadPool
,则有一个名为的函数,可用于控制并发运行线程的最大数量。另外,请记下该页上关于更改并发线程数的备注。

此代码演示了您需要的内容

只需使用seMaphoresim(与信号量相同,性能更好)对象即可

将信号灯视为计数器。每次你等的时候,计数器就会下降一个数字。在操作结束时需要释放它

当计数器为0时,无法获取信号量

关于线程池的建议,我认为这不是一个好主意,因为线程池在应用程序的许多部分都使用,而不仅仅是这个部分

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);
            }


        }
    }

一个Windows服务不能有多个实例,是吗?除非你是故意的:?这是一个XY问题。与其问你的解决方案,不如告诉我们问题出在哪里?我想我说得不对。我纠正了我的问题。