我不使用Windows窗体计时器 - 我使用的是System.Threading.Timer。实例化计时器时不会引发异常,据我所知,System.Threading.Timer不需要显式启动。
我尝试过使用System.Timers.Timer(请参阅代码中的注释)并更改回调的签名而没有运气。在回调方法中,我在一些EventLog写入中存根,甚至没有第一次写入事件日志。我在事件日志中看到的只是MyService.OnStart,然后启动了MyService(这些都来自OnStart事件)。为什么计时器回调事件没有触发?
public partial class MyService : ServiceBase
{
private static System.Threading.Timer timer;
public MyService()
{
InitializeComponent();
if (!System.Diagnostics.EventLog.SourceExists("MyService"))
{
System.Diagnostics.EventLog.CreateEventSource(
"MyService", "MyServiceLog");
}
eventLog1.Source = "MyService";
eventLog1.Log = "MyServiceLog";
}
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("MyService.OnStart event fired");
// setup timer to poll and execute an event
//Timer timer = new Timer(new TimerCallback(CheckCalls), null, 0, 10000);
try
{
timer = new System.Threading.Timer(new System.Threading.TimerCallback(CheckCalls), null, 0, 10000);
}
catch (Exception ex)
{
eventLog1.WriteEntry(ex.Message + " Stacktrace: " + ex.StackTrace);
}
eventLog1.WriteEntry("MyServicestarted");
GC.KeepAlive(timer);
}
}
和回调方法CheckCalls:
private static void CheckCalls(object objectState)
{
EventLog eventLog1 = new EventLog("MyServiceLog", "DAVIDWIN7", "MyService");
eventLog1.WriteEntry("MyService is polling");
}
Arg - 出于某种原因,当您构建 - >清除解决方案,然后构建 - >构建解决方案时,Visual Studio不会重建您的安装项目。我相信上面的代码工作正常,但我尝试了许多不同的修复,没有明确右键单击安装项目并选择Build。
我认为Clean Solution会强制所有项目在下一次构建时重建???
答案 0 :(得分:0)
您是否检查过运行该服务的帐户是否可以访问该事件日志?
答案 1 :(得分:0)
定时器线程写入事件日志时出错。
我让它在我的计算机上运行,但我用Console.writeline替换了所有的事件日志,因为我不想搞乱我的事件日志权限。
答案 2 :(得分:0)
请你去下载这个完全反映你所讨论的场景的测试应用程序:
我刚创造了这个。这是一项有效使用与您相同的代码的服务。唯一的区别是我使用工具箱将事件日志拖放到服务设计器上 - 将日志设置为“应用程序”,将源设置为“服务1”。
在项目文件夹中打开VS命令提示符,转到bin\debug
并运行installutil windowsservice1.exe
- 指定一些凭据(这样您就可以直接从bin输出文件夹安装dev服务)。
启动服务并监控应用程序日志 - 它将按您希望从代码中看到的每十秒钟写一次。
假设这在你的机器上运行(tm)就像在我的机器上运行(tm)那么我会建议问题是事件记录本身,或者恐怖的恐怖 - 你的服务没有从你的构建输出运行文件夹(我团队中的大多数开发人员坚持从不同的文件夹运行他们的开发服务,然后当他们开始调试时忘记实际更新二进制文件时发誓!)。
正如我在评论中建议的那样,你真的需要能够将调试器附加到这个并断开回调以验证它没有被触发。我从不依赖于事件日志来获取诊断消息,因为日志可能已满,或者权限可能会阻止您等等 - 它可能是一个Windows平台组件,但它并不像我想的那样可靠。
然而,调试器很少存在(除非已部署的二进制文件已过期;))。编译项目的调试版本,确保它是安装在服务列表中的那个,启动它,然后将直接附加到服务exe (没有必要试图附加到[service] .vshost.exe - VS无法自动附加或托管Windows服务,因为它们可以运行的唯一方法是通过svchost.exe对它们进行shell操作。)
希望这有帮助。