2011-09-25 64 views
1

我有我不知道的,我猜大约7秒钟,运行时服务。出于某种原因,服务在第一次运行后停止工作,我无法调试它。它始终在服务管理器上说“开始”,并且我无法在附加进程窗口中找到它。Windows服务的启动,停止,调试问题

当我试图阻止它,停止按钮出现只用一秒钟。即使按下它,我也会在本地计算机上看到一个错误,提示“windows无法停止服务”Splive服务没有返回错误,这可能是内部窗口错误或内部服务错误。“

什么是处理这个问题的最好方法?

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; 

    } 
+0

使用异常处理并记录异常...它会帮助您找到问题 – Damith

+0

取决于具体情况,但是您检查了事件日志吗? – Carsten

+0

我应该添加一个例外OnStart()和OnStop()我没有从GetListingsFromSp() –

回答

3

配置启动调试器下的服务: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. 服务已启动(在系统启动时,从用户的请求,...):单片机运行注册命令行

  2. Main运行s,告诉SCM(通过ServiceBase.Run)这是什么服务。此必须匹配步骤中使用的登记1.

  3. 传递给ServiceBase.Run实例有其OnStart调用。该服务应该启动它将执行的活动,然后返回(即异步操作,新线程和线程池都可以;继续调用OnStart的线程不是)。

  4. 当信号来关闭到达(从任何来源)OnStop被调用。这应该会触发停止所有OnStart开始(或从此开始)的活动并等待它们停止并返回。

的唯一原因的服务停止本身,如果别的东西(比如自己的管理API)触发时,它会是这样,但它会更好地使用单片机从UI。

+0

我在页面上做了说明。我得到windbg屏幕。但我无法理解任何输出。我无法复制或获取它的屏幕截图。但除了“无法找到符号文件”之外没有其他重要消息 –

+0

@Haditok您将需要在WinDBG中进行.NET调试的SOS扩展以及对符号文件的访问进行整理(最简单:将它们并排放置exe/dll文件)。网上有很多关于使用WinDBG和一些好书的帮助。 – Richard

3

理想情况下,你将要调试服务的OnStart方法,看看发生了什么事情。它是可能的:

protected override void OnStart(string[] args) 
{ 
    #if DEBUG 
    Debugger.Launch(); 
    #endif 
    ... 
} 

这样,即使服务未标记为桌面互动。

0

OnStart和OnStop处理程序具有处理的固定时间限制。我不知道如何停止工作(是否等待线程完成..),但对于OnStart,就你的情况而言(我知道它是一个旧线程..)我会将所有应用程序代码移到定时器回调并在OnStart函数中设置定时器。我把我的时间设定为大约1分钟。 OnStart将立即退出,这符合服务管理员的要求。但是现在你有一个线程可以在一分钟内开始,这使你有时间把你的进程附加到调试器上。显然在OnStart定时器回调的第一条指令上设置了一个断点。