我有一个Windows服务项目的代码。我已成功构建并安装它。当我启动它时,我在事件日志中启动了一个事件。但是,我从来没有得到“In Onstart”的事件,为什么会这样呢?
namespace ADServiceCarlos
{
public partial class ADServiceCarlos : ServiceBase
{
public ADServiceCarlos()
{
InitializeComponent();
this.AutoLog = true;
if (!System.Diagnostics.EventLog.SourceExists("MySource"))
{
System.Diagnostics.EventLog.CreateEventSource(
"MySource","MyNewLog");
}
eventLog1.Source = "MySource";
eventLog1.Log = "MyNewLog";
}
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("In OnStart");
}
protected override void OnStop()
{
}
}
}
答案 0 :(得分:4)
好的,这可能会解决您的问题。如果没有能够看到你的所有代码,很难说清楚,但read this - 更具体地说是“警告”部分。
不要使用构造函数来执行应该处理的处理 的OnStart。使用OnStart处理服务的所有初始化。该 构造函数在应用程序的可执行文件运行时调用,而不是在何时运行 服务运行。可执行文件在OnStart之前运行。当你 继续,例如,因为没有再次调用构造函数 SCM已将对象保存在内存中。如果OnStop发布资源 在构造函数中而不是在OnStart中分配所需的 第二次服务时不会再创建资源 调用。
因此,您在构造函数中初始化事件日志所做的一切都应移至OnStart
事件。这将确保每次服务启动时都能正确创建,这意味着您应该能够正确记录OnStart
事件(假设您在初始化后执行此操作)
答案 1 :(得分:1)
基于@musefan发布的内容,这是一个例子。我必须完全将所有内容移出构造函数。
public class ServiceMain : System.ServiceProcess.ServiceBase
{
public const string SERVICE_NAME = "ServiceName";
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
public ServiceMain()
{
// This call is required by the Windows.Forms Component Designer.
InitializeComponent();
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
this.ServiceName = SERVICE_NAME;
this.CanPauseAndContinue = true;
}
static void Main()
{
//Log all unhandled exceptions
AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;
System.ServiceProcess.ServiceBase[] ServicesToRun;
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new ServiceMain() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
components.Dispose();
}
base.Dispose(disposing);
}
/// <summary>
/// Set things in motion so your service can do its work.
/// </summary>
protected override void OnStart(string[] args)
{
//Do your stuff here
}
static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e)
{
Environment.Exit(1);
}
}