我已经制作了一个简单的Windows服务,但是当我尝试启动它时,会立即关闭以下消息:
本地计算机上的ConsumerService服务已启动,然后停止。如果某些服务未被其他服务或程序使用,则会自动停止。
以下是我尝试运行的服务:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
var servicesToRun = new ServiceBase[]
{
new ConsumerService()
};
ServiceBase.Run(servicesToRun);
}
}
public partial class ConsumerService : ServiceBase
{
private readonly MessageConsumer<ClickMessage> _messageconsumer;
private readonly SqlRepository _sqlrep;
private static Timer _timer;
public ConsumerService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
try
{
File.Create(@"c:\ErrorLog.txt");
WriteToFile("Has started : " + DateTime.UtcNow);
var t = new Timer(OnTimeEvent, null, 1000, 1000);
}
catch (Exception e)
{
WriteToFile("Error : " + e.Message);
}
}
private void OnTimeEvent(object state)
{
WriteToFile("The time is : " + DateTime.UtcNow);
}
protected override void OnStop()
{
WriteToFile("Has stopped : " + DateTime.UtcNow);
}
private static void WriteToFile(string s)
{
var stream = File.AppendText(@"c:\ErrorLog.txt");
stream.WriteLine(s);
}
}
正如您所看到的,它只是一个简单的计时器,每1秒向文件写一行,所以我很困惑为什么这会阻止服务运行。我也很难看到Windows提供的消息与此服务有什么关系,因为这会阻止任何服务运行,除非某些服务已经依赖它。
答案 0 :(得分:1)
这很可能是由于主线程中出现未处理的错误。要验证这一点,请检查事件日志,但是从代码的快速查看中,函数WriteToFile
有可能崩溃并使整个服务失效。
实际上它应该崩溃,因为你让流保持打开状态(因此文件被锁定),第二次尝试打开它将导致错误。
将代码更改为此代码,它应该可以防止此类崩溃并修复将文件锁定的错误:
private static void WriteToFile(string s)
{
try
{
using (var stream = File.AppendText(@"c:\ErrorLog.txt"))
{
stream.WriteLine(s);
stream.Close();
}
}
catch (Exception e)
{
Console.WriteLine("error writing to file: " + e);
//...or any other means of external debug...
}
}
答案 1 :(得分:1)
正如我所看到的,您的代码正在结束......因此,程序的执行自然而然地结束了。这就是为什么你的服务也停止了,因为它的执行结束了。
答案 2 :(得分:0)
来自msdn:
只要您使用Timer,就必须保留对它的引用。如 使用任何托管对象时,Timer都会进行垃圾回收 没有提及它。 Timer仍然有效的事实 不会阻止它被收集。
您不会保留对Timer
对象的任何引用。
尝试更改此内容:
private static Timer _timer;
到此:
private Timer _timer;
而且:
var t = new Timer(OnTimeEvent, null, 1000, 1000);
到此:
_timer = new Timer(OnTimeEvent, null, 1000, 1000);