为什么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 语句之前添加空检查。
我的 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 语句之前添加空检查。