gpt4 book ai didi

c# - Windows服务启动、停止、调试问题

转载 作者:可可西里 更新时间:2023-11-01 11:09:28 24 4
gpt4 key购买 nike

我有一个服务,我不知道它的运行时间,我猜大约 7 秒。由于某种原因,该服务在第一次运行后停止工作,我无法调试它。它一直在服务管理器上显示“正在启动”,但我在附加进程窗口中找不到它。

当我尝试停止它时,停止按钮只出现一秒钟。即使我按下它,我也会收到一条错误消息,提示“Windows 无法停止本地计算机上的‘Splive’服务。该服务没有返回错误。这可能是 Windows 内部错误或内部服务错误。”

处理此问题的最佳方法是什么?

static void Main(string[] args)
{
ServiceBase.Run(new Program());
ServiceController service = new ServiceController();
service.ServiceName = "SpLive";
service.Start();
//Sp objSportingbet = new Sp();
//objSportingbet.getListingsFromSp();
}
public Program()
{
this.ServiceName = "SpLive";
}
protected override void OnStart(string[] args)
{
base.OnStart(args);
objSportingbet.getListingsFromSp();
timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed);
timer1.Interval = 7000;
timer1.Enabled = true;
timer1.Start();
}
protected override void OnStop()
{
base.OnStop();
timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed);
timer1.Interval = 7000;
timer1.Enabled = false;
timer1.Start();
}
private void timer1_Elapsed(object sender, EventArgs e)
{
ServiceController service = new ServiceController();
service.ServiceName = "Sp";
if (service.Status == ServiceControllerStatus.Stopped)
{
service.Start();
}
if (service.Status == ServiceControllerStatus.Running)
{
service.Stop();
}
timer1.Stop();
}

private void InitializeComponent()
{
//
// Program
//
this.CanPauseAndContinue = true;
this.CanShutdown = true;

}

最佳答案

将服务配置为在调试器下启动:http://support.microsoft.com/kb/824344请注意“配置服务以附加 WinDbg 调试器启动”部分

添加(现在有问题的代码):

static void Main(string[] args)
{
ServiceBase.Run(new Program());
ServiceController service = new ServiceController();
service.ServiceName = "SpLive";
service.Start();

ServiceBase.Run(instance) 在服务关闭之前不会返回,因此您正在运行该服务,然后在它关闭后要求 SCM 运行该服务……这只会导致混淆。

这个,再加上有一个计时器来尝试和反转服务的状态(启动 <-> 停止),我认为您需要考虑 Windows 服务的底层进程模型:

当exe只实现一个服务时:

  1. 服务启动(在系统启动时,根据用户请求,...):SCM 运行已注册的命令行

  2. Main 运行,告诉 SCM(通过 ServiceBase.Run)这是什么服务。这必须与第 1 步中使用的注册匹配。

  3. 传递给 ServiceBase.Run 的实例调用了它的 OnStart。服务应启动它将执行的事件,然后返回(即异步操作、新线程和线程池正常;继续调用 OnStart 的线程则不行)。

    <
  4. 当关闭信号到达时(来自任何来源)OnStop 被调用。这应该触发停止 OnStart 开始(或之后开始)的所有事件,并等待它们停止然后返回。

服务停止自身的唯一原因是其他东西(例如它自己的管理 API)触发了它,但最好从 UI 使用 SCM。

关于c# - Windows服务启动、停止、调试问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7544204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com