C# 中用 TopShelf服务创建和延迟运行

TopShelf 是一个开源项目,它简化了在 .NET 环境中创建和管理 Windows 服务的流程。以下是一个简单的示例,展示了如何使用 TopShelf 创建一个服务,并在服务启动后延迟执行某些操作。

首先,确保你已经安装了 TopShelf。你可以通过 NuGet 包管理器来安装它:

Install-Package Topshelf

然后,你可以创建一个服务类,如下所示:

using System;
using System.Threading;
using System.Threading.Tasks;
using Topshelf;

public class MyService
{
    private Timer _timer;
    private bool _isRunning;

    public bool Start(HostControl hostControl)
    {
        _isRunning = true;
        // 假设我们希望在服务启动后延迟 10 秒再执行某些操作
        Task.Delay(10000).Wait(); // 等待 10 秒
        StartMyServiceOperations(); // 开始你的服务操作
        return true;
    }

    private void StartMyServiceOperations()
    {
        // 初始化并启动一个定时器来模拟服务的工作
        _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromMinutes(1)); // 每分钟执行一次
    }

    private void DoWork(object state)
    {
        Console.WriteLine("Service is performing work...");
    }

    public bool Stop(HostControl hostControl)
    {
        _isRunning = false;
        _timer?.Change(Timeout.Infinite, Timeout.Infinite);
        _timer?.Dispose();
        return true;
    }
}

接下来,你需要配置 Topshelf 服务,并安装它:

class Program
{
    static void Main(string[] args)
    {
        var exitCode = HostFactory.Run(x =>
        {
            x.Service<MyService>(s =>
            {
                s.ConstructUsing(name => new MyService());
                s.WhenStarted(tc => tc.Start(null));
                s.WhenStopped(tc => tc.Stop(null));
            });
            x.RunAsLocalSystem(); // 以本地系统身份运行服务
            x.SetDescription("My Topshelf Service"); // 设置服务描述
            x.SetDisplayName("MyTopshelfService"); // 设置服务显示名称
            x.SetServiceName("MyTopshelfService"); // 设置服务名称
        });
        
        int exitCodeValue = (int)Convert.ChangeType(exitCode, exitCode.GetTypeCode());
        Environment.ExitCode = exitCodeValue;
    }
}

在上面的代码中,MyService 类包含了服务的核心逻辑。Start 方法在服务启动时调用,并使用了 Task.Delay 来模拟延迟启动的行为。一旦延迟时间过去,就会调用 StartMyServiceOperations 方法来开始服务的实际工作。在这个例子中,我创建了一个简单的定时器来模拟服务的持续运行。

Program 类的 Main 方法配置了 Topshelf 服务并运行它。你可以通过 Topshelf 提供的命令行工具来安装、卸载和启动服务。例如,要安装服务,你可以在命令行中运行:

MyService.exe install

要启动服务,你可以使用 Windows 的服务管理工具,或者使用命令行:

net start MyTopshelfService

请注意,运行服务需要管理员权限。此外,根据你的具体需求,你可能需要调整服务的逻辑和配置。

如果想把服务设置成延迟启动,可以应用一下配置

如果你想使用 Topshelf 来配置一个延迟自动启动类型的服务,可以通过设置 StartAutomaticallyDelayed 方法来实现。这样可以让服务在系统启动后延迟一段时间后自动启动。下面是修正后的代码示例:

using System;
using System.Threading;
using Topshelf;

public class MyService
{
    private Timer _timer;
    private bool _isRunning;

    public bool Start(HostControl hostControl)
    {
        _isRunning = true;
        StartMyServiceOperations(); // 开始你的服务操作
        return true;
    }

    private void StartMyServiceOperations()
    {
        // 初始化并启动一个定时器来模拟服务的工作
        _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromMinutes(1)); // 每分钟执行一次
    }

    private void DoWork(object state)
    {
        Console.WriteLine("Service is performing work...");
    }

    public bool Stop(HostControl hostControl)
    {
        _isRunning = false;
        _timer?.Change(Timeout.Infinite, Timeout.Infinite);
        _timer?.Dispose();
        return true;
    }
}

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

            x.RunAsLocalSystem(); // 以本地系统身份运行服务
            x.StartAutomaticallyDelayed(); // 设置延迟自动启动
            x.SetDescription("My Topshelf Service"); // 设置服务描述
            x.SetDisplayName("MyTopshelfService"); // 设置服务显示名称
            x.SetServiceName("MyTopshelfService"); // 设置服务名称
        });
    }
}

在这个修正后的代码中,关键的更改是在 HostFactory.Run 方法中使用了 StartAutomaticallyDelayed 方法来配置服务延迟自动启动。这样一来,当系统启动后,服务会在一段时间后自动启动,而不是立即启动。

你可以通过这种方式来配置 Topshelf 服务,使其符合你的需求。记得根据具体情况调整服务的逻辑和配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

望天hous

你的鼓励是我最大动力~谢谢啦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值