c# Windows服务——本地计算机上的服务启动然后停止

本文关键字:服务 启动 然后 计算机 Windows | 更新日期: 2023-09-27 18:06:06

我正在尝试创建我的第一个Windows服务,但是很伤心…在我从services中手动启动服务之后。Msc,消息"本地计算机上的服务启动然后停止"。有些服务会自动停止,因为它们没有工作要做。

我敢肯定我的代码中一定有什么错误…

namespace ConvertService
{
public partial class Service1 : ServiceBase
{
    public Service1()
    {
        this.ServiceName = "ConvertService";
        this.EventLog.Log = "Application";
    }
    static void main()
    {
        ServiceBase.Run(new Service1());
    }

    protected override void OnStart(string[] args)
    {
        Process pMP3 = new Process();
        pMP3.StartInfo.UseShellExecute = false;
        pMP3.StartInfo.RedirectStandardOutput = true;
        pMP3.StartInfo.FileName = @"d:'...path...'converter.exe";
        pMP3.StartInfo.Arguments = @"d:'...path...'tempamr.amr " + @"d:'...path...'tempmp3.mp3 " + @"-cmp3";
        pMP3.Start();
        pMP3.WaitForExit();
        Process pWAV = new Process();
        pWAV.StartInfo.UseShellExecute = false;
        pWAV.StartInfo.RedirectStandardOutput = true;
        pWAV.StartInfo.FileName = @"d:'...path...'converter.exe";
        pWAV.StartInfo.Arguments = @"d:'...path...'tempmp3.mp3 " + @"d:'...path...'tempwav.wav " + @"-cwav";
        pWAV.Start();
        pWAV.WaitForExit();
    }
    protected override void OnStop()
    {
    }
}

}

如果我犯了愚蠢的错误,请原谅我。这是我第一次使用Windows服务。

p。我已经勾选了"允许服务与桌面交互"

c# Windows服务——本地计算机上的服务启动然后停止

您没有为OnStart方法创建一个正在运行的线程。基本上,服务管理器调用OnStart来启动服务,并且该调用需要在大约15秒左右完成。在内部,您应该创建一个带有循环的线程,该线程在一段时间内实际调用您的代码。像这样:

protected CancellationTokenSource _tokenSource = null;
protected Task _thread = null;
protected override void OnStart(string[] args)
{
    _tokenSource = new CancellationTokenSource();
    _thread = Task.Factory.StartNew(() => DoMyServiceLogic(), TaskCreationOptions.LongRunning, _tokenSource);
}
protected override void OnStop()
{
     _tokenSource.Cancel();
}
protected void DoMyServiceLogic()
{
     while(!_tokenSource.Token.IsCancellationRequested)
     {
         // Do Stuff
     }
}

你的服务没有真正遵循模式;你不能连续地做事情,这应该更像一个控制台程序。

实际上,这是因为您的服务在完成OnStart方法后立即停止做任何事情。这就像当您在控制台程序中完成Main时发生的情况-应用程序刚刚退出。

检查以确保您的服务运行的帐户可以访问这些文件(包括对。wav和。mp3文件的写访问权限)

您的代码也可能导致未处理的异常。我不确定,但这可能在事件日志中可见。你也可以让你的服务显式地将消息写入事件日志(比如在异常的情况下);点击此链接:http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

打开eventvwr.msc。在那里,您将看到有关windows服务停止工作的异常详细信息。顺便说一下,你应该尽快离开OnStart方法,因为你只有有30秒来完成OnStart方法。MSDN上有一篇很棒的文章描述了"如何调试"Windows服务