我正在写一个由定时器启动的windows服务,并且每分钟都会耗费一些时间。我想限制没有。一次运行的服务实例数量为100.我该怎么做?任何想法?限制no。 Windows服务中的实例
编辑:我想限制没有。由定时器启动的线程。
我正在写一个由定时器启动的windows服务,并且每分钟都会耗费一些时间。我想限制没有。一次运行的服务实例数量为100.我该怎么做?任何想法?限制no。 Windows服务中的实例
编辑:我想限制没有。由定时器启动的线程。
这听起来像一个非常糟糕的设计 - 和一个内存/ cpu猪。我不确定当你说100个Windows服务时,我理解你的意思 - 因为服务是一项服务。至少在具有独特服务的意义上说。你是否通过任务管理器启动了100个隐藏在后台运行的应用程序?如果是这样的话,你可以通过创建一个真正的Windows服务并使用该服务中的逻辑来控制应用程序的流程(以及运行代码的多个实例的执行)来实现更好的效果。
例如,你可以有一个主服务,其中一个主线程可以睡n个。秒,然后执行。主线程唤醒后,它将负责分离新线程。例如,您可以使用线程池,而您可以控制活动的线程数。您的主线程将检查线程池以确定它是否已达到容量,并且如果有效,请关闭一个新线程。
Main Service Thread
> Sleep n. seconds
> ThreadPool < 100?
> New Thread
我想我把这个方法弄错了。我纠正了我的问题。 – Dnana
如果您使用System.Threading.ThreadPool
,有一个名为SetMaxThreads功能,您可以控制同时运行的线程的最大数量。另外,请记下该页面上有关更改并发线程数的说明。
此代码演示您需要什么。
只要使用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);
}
}
}
我会试试看。 – Dnana
您不能拥有多个Windows服务实例吗?除非你故意这样做:http://www.codeproject.com/KB/dotnet/MultipleInstNetWinService.aspx? –
这是一个XY问题。不要问你的解决方案,告诉我们问题是什么? –