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