我实现了 windows 服务,eventLog
它FileSystemWatcher
查找特定目录中的更改并将消息写入MyLog
.
奇怪的事情 1:
我通过 installUtil.exe 安装它(因为 VS2012 没有安装程序模板),在某些情况下,当我转到“服务”并启动我得到的服务时:
本地计算机上的 [服务名称] 服务启动然后停止。如果某些服务没有被其他服务或程序使用,它们会自动停止。
我已经看过这个问题了。这篇文章的 2 个答案为什么会这样:
1)方法中没有线程启动OnStart()
。
我使用设计器并在“属性”窗口中设置了大部分属性,并且我从未手动启动任何线程,但在某些情况下一切正常,所以我认为情况并非如此。
2)方法发生异常OnStart()
。我认为情况并非如此,因为我没有更改代码。我只是卸载、构建并再次安装相同的服务,在某些情况下它运行,在某些情况下不运行。
当我被这个东西卡住了 2 个小时时,我注意到它的Source
属性eventLog
太长了:“FilesMonitoringServices”。我将其更改为“MonitorSource”,一切都开始工作了。比我重新安装它几次并得到与上述相同的警告。我Source
再次更改了属性,现在服务运行了。
这是第一个奇怪的事情。
怪事2:更糟。即使它只运行它的日志OnStart()
和OnStop()
方法,我的意思是 fileSystemWatcher 事件处理程序永远不会执行。这很奇怪,因为今天我重新安装了这个服务 mabby 一百次和 3 次它正在工作,但是在我再次重新安装它之后它停止了。而且我根本没有更改重新安装之间的代码。
这是我的类(MonitoringService)中继承的方法和构造函数ServiceBase
:
public MonitoringService()
{
InitializeComponent();
if (!EventLog.SourceExists(eventLog.Source))
{
EventLog.CreateEventSource(eventLog.Source, eventLog.Log);
}
// haven't changed it between the reinstallations
fileWatcher.Path = @"path";
}
protected override void OnStart(string[] args)
{
fileWatcher.EnableRaisingEvents = true;
eventLog.WriteEntry("start", EventLogEntryType.Information);
base.OnStart(args);
}
protected override void OnStop()
{
fileWatcher.EnableRaisingEvents = false;
fileWatcher.Dispose();
eventLog.WriteEntry("stop", EventLogEntryType.Information);
base.OnStop();
}
和文件系统观察者事件处理程序:
private void fileSystemWatcher1_Changed(object sender, FileSystemEventArgs e)
{
using (var conn = new SqlConnection(GetConnectionString()))
{
conn.Open();
var productId = Convert.ToInt32(Regex.Match(e.Name, @"\d+").Value);
const string cmd = "UPDATE Products SET ImageModifiedDate=@date WHERE ProductId=@productId";
using (var command = new SqlCommand(cmd, conn))
{
command.Parameters.AddWithValue("@productId", productId);
command.Parameters.AddWithValue("@date", DateTime.Now);
command.ExecuteNonQuery();
}
}
eventLog.WriteEntry(string.Format("{0} has been changed: {1}", e.Name, DateTime.Now), EventLogEntryType.Information);
}
问题:在我看来,这种行为不是由我的代码引起的,而是由操作系统设置引起的。可以吗?
****编辑:刚刚发现了更具体的东西:**
1)如果它显示消息(当我想启动服务时):
The [service name] service on local computer started and then stopped. ....
我需要更改、重建和重新安装Source
的属性。eventLog
并且此消息不会出现;mabby 下次再来。
2)我有以下文件夹层次结构:images/prod-images
. images
和prod-images
目录都包含图像文件。当服务正在运行并且我从prod-images
文件夹更改图像时,消息会按照我的需要写入日志并更新数据库。但在此事件发生后,服务停止!(我检查了 3 次)。当我重新启动它并再次重复几次时,它会更新数据库,写入日志并在我得到的 3d 时间
The [service name] service on local computer started and then stopped. ....
但这不是最好的部分)如果我更改images
目录中的图像,我可以多次执行并且服务不会停止。(只有来自images/prod-images
的图像绑定到数据库中的条目)。
那么,mabbe 这个特性在某种程度上是指数据库访问吗?
编辑 2:在 Visual Studio 中我DEBUG -> Attach to Process
用来调试服务。我设置了断点并更改了图像。事件处理程序第一次完美执行:更新数据库并写入日志消息。但是我继续按 F11(Step Into),这个事件处理程序第二次执行。在线上
var productId = Convert.ToInt32(Regex.Match(e.Name, @"\d+").Value);
我得到“FormatException
未处理”。在此之后我停止调试并且服务停止!就是这样:异常发生在事件处理程序中。
你知道它为什么第二次执行吗?谢谢!
PS我已经提交了 Davut Gürbüz 的答案,因为他为我指出了正确的方向。
无论如何,请查看我自己解释实际问题的答案。