下面的代码构建没有任何错误,并作为控制台应用程序运行良好。但是现在我已经将它变成了WindowsService并使用C:\ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil来成功安装它。它一启动就会停止。我觉得我错过了一些简单的东西,一旦另一双眼睛注视着它,我就会永远地打击自己。
请原谅你看到的烂摊子。我会在它正常工作后清理它。提前感谢您提供的任何帮助。
Service1.cs
namespace LGCDialHome
{
public partial class Service1 : ServiceBase
{
private System.Timers.Timer _timer = null;
public Service1()
{
InitializeComponent();
System.Timers.Timer stateTimer = new System.Timers.Timer(60000);
}
protected override void OnStart(string[] args)
{
try
{
EventLog.WriteEntry("Dial Home service started : " + DateTime.Now);
_timer = new System.Timers.Timer();
_timer.Interval = 10000; //in milliseconds
EventLog.WriteEntry("Timer Interval is : " + _timer.Interval);
_timer.Elapsed += timer_Elapsed;
_timer.Start();
}
catch (Exception ex)
{
EventLog.WriteEntry("Dial Home service error : " + ex);
}
}
protected override void OnStop()
{
EventLog.WriteEntry("Dial Home service Stopped : " + DateTime.Now);
}
protected void timer_Elapsed(object sender, ElapsedEventArgs e)
{
int invokeCount = 0;
int maxCount = 10;
string host = Environment.MachineName;
string user = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
string uname = Environment.UserName;
try
{
_timer.Stop();
Console.WriteLine("{0} Checking status {1,2}.",
DateTime.Now.ToString("h:mm:ss.fff"),(++invokeCount).ToString());
Console.WriteLine("Host -> {0} \r\nNTID -> {1}", host, user);
if (invokeCount == maxCount)
{
invokeCount = 0;
}
}
catch (Exception ex)
{
EventLog.WriteEntry("Dial Home service error : " + ex);
}
finally
{
_timer.Start();
}
}
}
}
答案 0 :(得分:1)
嗯,您需要调试代码,但附加到Windows服务与调试其他类型的项目有点不同。
尝试以下方法:
1-在OnStart()
方法的最开始,添加以下行:
System.Threading.Thread.Sleep(10000);
2-在上一行之后立即在下一行上设置断点。使用InstallUtil
构建并重新安装您的服务。
3-开始服务。
4-在Visual Studio中,单击Debug -> Attach to Process
。
5-在Available Processes
列表中查找您的服务并附加到该服务。这将导致断点被触发,并允许您调试代码以查看是否抛出任何异常(通过查看您的代码,我觉得问题可能与安全性有关。服务运行的用户可能不会可以访问EventLog
或其他内容。
注意:启动服务后,您有10秒钟执行第4步和第5步。如果您认为需要更多时间,请将睡眠值更改为20000
(20秒)。