4

我有以下代码用于 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()
        {
        }
    }
}
4

2 回答 2

4

好的,所以这可能会解决您的问题。如果无法查看所有代码,很难准确判断,但请阅读此内容- 更具体地说是“警告”部分。

不要使用构造函数来执行应该在 OnStart 中的处理。使用 OnStart 处理服务的所有初始化。构造函数在应用程序的可执行文件运行时调用,而不是在服务运行时调用。可执行文件在 OnStart 之前运行。例如,当您继续时,不会再次调用构造函数,因为 SCM 已将对象保存在内存中。如果 OnStop 释放在构造函数中而不是在 OnStart 中分配的资源,则在第二次调用服务时不会再次创建所需的资源。

因此,您在构造函数中初始化事件日志所做的一切都应该移至OnStart事件中。这将确保每次服务启动时都能正确创建它,这意味着您应该能够OnStart正确记录您的事件(前提是您在初始化后执行此操作)

于 2012-10-09T12:03:57.033 回答
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);
        }
}
于 2015-06-03T19:14:11.547 回答