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。我已经勾选了"允许服务与桌面交互"
您没有为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服务