为什么Windows 服务无故停止?使用 C#.net

Why Windows Service stops for no reason? using C#.net

我的 windows 使用 C#.net 构建的服务

就是用命令行调用另一个软件

调用软件已完成,100% 确定它可以从普通表单应用程序运行。

在我的例子中,当我启动服务时,它开始正常,运行s 一个计时器,在这个计时器内 运行 命令行。

出于某种原因,我无法找到服务在第二次调用计时器后自行停止的原因。

我跟踪了这​​个问题,但我找不到它停止的原因以及如何解决它。

我简化了调用“PING”命令的服务。仍然停止服务。

这是我的代码,如果有人能告诉我问题是什么以及如何解决,我将不胜感激。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Timers;

namespace cProcessor
{
    public partial class cProcessorSrv : ServiceBase
    {

        EventLog eventLog1;

        public cProcessorSrv()
        {
            InitializeComponent();
            eventLog1 = new System.Diagnostics.EventLog();
            if (!System.Diagnostics.EventLog.SourceExists("cPr"))
            {
                System.Diagnostics.EventLog.CreateEventSource(
                    "cPr", "cPrLog");
            }
            eventLog1.Source = "cPr";
            eventLog1.Log = "cPrLog";
        }

        protected override void OnStart(string[] args)
        {
            try
            {
                eventLog1.WriteEntry("OnStart");
                Timer timer = new Timer();
                timer.Interval = 15 * 1000;
                timer.Elapsed += new ElapsedEventHandler(this.OnTimer);
                timer.Start();
            }
            catch(Exception ex)
            {
                eventLog1.WriteEntry("Exception : " + ex.ToString());

            }
        }

        public void OnTimer(object sender, ElapsedEventArgs args)
        {

            try
            { 

            eventLog1.WriteEntry("OnTimer");
            string command = "ping yahoo.com";
            string workingFolder = @"c:\";
            var processInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
            processInfo.CreateNoWindow = true; ;
            processInfo.UseShellExecute = false;
            processInfo.RedirectStandardError = true;
            processInfo.RedirectStandardOutput = true;
            processInfo.WorkingDirectory = workingFolder;

            var process = Process.Start(processInfo);


            process.OutputDataReceived += (object snd, DataReceivedEventArgs e) =>
            {

                if (e.Data.Contains("INFO FileTreeXmiWriter") || e.Data.Contains("INFO FileTreeReader") || e.Data.Contains("error"))
                {
                    eventLog1.WriteEntry("output>>" + e.Data);
                }
            };


            process.BeginOutputReadLine();

            process.ErrorDataReceived += (object snd, DataReceivedEventArgs e) =>
            {
                eventLog1.WriteEntry("error>>" + e.Data);
            };
            process.BeginErrorReadLine();

            process.WaitForExit();

            eventLog1.WriteEntry("ExitCode: " + process.ExitCode.ToString());
            process.Close();

                /* */
            }
            catch(Exception ex)
            {
                eventLog1.WriteEntry("Exception :" + ex.ToString());
            }
        }



    }
}

这是日志结果(只有 3 条信息)

OnStart 
OnTimer 
error>>

我调试了 Windows 服务代码 like this,发现它在 e.Data.Contains("INFO FileTreeXmiWriter") 上崩溃了,因为 e.Data 为空。一种解决方案是在 运行 IF 语句之前添加空检查。