我正在使用 TopShelf 来托管我的 Windows 服务。这是我的设置代码:

static void Main(string[] args)
{
    var host = HostFactory.New(x =>
    {
        x.Service<MyService>(s =>
        {
            s.ConstructUsing(name => new MyService());
            s.WhenStarted(tc => tc.Start());
            s.WhenStopped(tc => tc.Stop());
        });

        x.RunAsLocalSystem();
        x.SetDescription(STR_ServiceDescription);
        x.SetDisplayName(STR_ServiceDisplayName);
        x.SetServiceName(STR_ServiceName);
    });

    host.Run();
}

我需要确保我的应用程序只有一个实例可以同时运行。目前,您可以同时将其作为 Windows 服务和任意数量的控制台应用程序启动。如果应用程序在启动期间检测到其他实例,它应该退出。

我真的很喜欢基于 mutex 的方法,但不知道如何与 TopShelf 一起使用。

最佳答案

这对我有用。结果证明真的很简单——互斥锁代码只存在于控制台应用程序的 Main 方法中。以前,我使用这种方法进行了假阴性测试,因为互斥锁名称中没有“全局”前缀。

private static Mutex mutex = new Mutex(true, @"Global\{my-guid-here}");

static void Main(string[] args)
{
    if (mutex.WaitOne(TimeSpan.Zero, true))
    {
        try
        {
            var host = HostFactory.New(x =>
            {
                x.Service<MyService>(s =>
                {
                    s.ConstructUsing(name => new MyService());
                    s.WhenStarted(tc =>
                    {
                        tc.Start();
                    });
                    s.WhenStopped(tc => tc.Stop());
                });
                x.RunAsLocalSystem();
                x.SetDescription(STR_ServiceDescription);
                x.SetDisplayName(STR_ServiceDisplayName);
                x.SetServiceName(STR_ServiceName);
            });

            host.Run();
        }
        finally
        {
            mutex.ReleaseMutex();
        }
    }
    else
    {
        // logger.Fatal("Already running MyService application detected! - Application must quit");
    }
}

关于c# - 强制单实例 TopShelf 服务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11487541/

10-12 14:06