Windows服务-一次只允许一个实例
本文关键字:一次 许一个 实例 服务 Windows | 更新日期: 2023-09-27 18:05:54
我尝试用下面的代码来限制windows服务的第二个实例,但下面的代码不适合我,谁能帮助我。我设置了运行服务的时间间隔,即5分钟,如果第一个实例启动并运行,即使第一个实例没有完成,5分钟后第二个实例也会启动。
static class Program
{
[STAThread]
static void Main()
{
bool ok;
System.Threading.Mutex m = new System.Threading.Mutex(true, "ImageImportService", out ok);
if (!ok)
{
return;
}
GC.KeepAlive(m);
if (PriorProcess() != null)
{
return;
}
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new ImageImportService()
};
ServiceBase.Run(ServicesToRun);
}
public static Process PriorProcess()
{
Process curr = Process.GetCurrentProcess();
Process[] procs = Process.GetProcessesByName(curr.ProcessName);
foreach (Process p in procs)
{
if ((p.Id != curr.Id) && (p.MainModule.FileName == curr.MainModule.FileName))
return p;
}
return null;
}
}
服务控制管理器,Windows的一个组件,不允许启动一个Windows服务,如果它已经运行。相信我吧。
你需要做的主要事情是永远不要直接启动你的可执行文件。相反,在从代码启动服务时使用ServiceController
类,在手动启动/停止服务时使用控制面板(services.msc
)。
在某些情况下,您可能需要采取额外的步骤来确保服务在停止后不会保留任何资源,从而防止其自己的后续启动,直到某个较低级别超时。但是您的问题中没有任何内容表明您已经遇到了此类问题(例如,重新绑定TCP端口)。