我使用eventLog
和FileSystemWatcher
实现了Windows服务,该服务查找特定目录中的更改并将消息写入MyLog
。
奇怪的事1:
我通过installUtil.exe安装它(因为VS2012没有安装程序模板),在某些情况下,当我转到“服务”并启动我得到的服务时:
本地计算机上的[服务名称]服务已启动然后停止。如果某些服务未被其他服务或程序使用,则会自动停止。
我已经看过this question了。 2回答这个帖子为什么会这样:
1)OnStart()
方法中没有线程开始
我使用设计器并在“属性”窗口中设置大多数属性,我从未手动启动任何线程,但在某些情况下,一切都正常,所以我认为情况并非如此。
2)OnStart()
方法中发生异常。我认为情况并非如此,因为我没有更改代码。我只是卸载,构建并再次安装相同的服务,在某些情况下它运行,有些则没有。
当我因为这件事被卡住了2个小时,我注意到Source
的{{1}}属性太长了:“FilesMonitoringServices”。我把它改成了“MonitorSource”,一切都开始工作了。比我重新安装它几次,并得到与上述相同的警告。我再次更改了eventLog
属性,现在服务正在运行
这是第一个奇怪的事情。
奇怪的事情2:更糟。即使它运行它只记录Source
和OnStart()
方法,我的意思是fileSystemWatcher事件处理程序永远不会执行。这很奇怪,因为今天我重新安装了这个服务mabby一百次和三次它正在工作,但在我重新安装它再次它停止。我根本没有更改重新安装之间的代码。
以下是我的类(MonitoringService)中继承OnStop()
的方法和构造函数:
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();
}
问题:在我看来,这种行为不是由我的代码引起的,而是由操作系统设置引起的。可以吗?
****编辑:刚发现更具体的东西:**
1)如果它显示消息(当我想启动服务时):
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);
}
我需要更改The [service name] service on local computer started and then stopped. ....
的{{1}}属性,重建并重新安装。这条消息不会出现; mabby下次。
2)我有以下文件夹层次结构:Source
。 eventLog
和images/prod-images
目录都包含图像文件。当服务运行并且我从images
文件夹更改图像时,消息将根据需要写入日志并更新数据库。但在此次活动结束后,服务停止了! (我检查了3次)。当我重新启动它并重复几次它会更新数据库,写日志和3d时间我得到
prod-images
但这不是最好的部分)如果我更改prod-images
目录中的图像,我可以多次执行此操作并且服务不会停止。 (只有来自The [service name] service on local computer started and then stopped. ....
的图像被绑定到数据库中的条目)。
那么,mabbe这个功能以某种方式引用数据库访问?
在Visual Studio中 编辑2:我使用images
来调试服务。我设置了断点并更改了图像。第一次事件处理程序完美执行:更新数据库并写入日志消息。但是,我继续按F11(Step Into)并且此事件处理程序第二次执行。在
images/prod-images
我得到“DEBUG -> Attach to Process
未处理”。在此之后我停止调试并停止服务!就是这样:事件处理程序中发生异常。
你知道它为什么第二次执行吗?谢谢!
P.S。我已经提到了DavutGürbüz,因为他指出了我正确的方向。
无论如何,请查看我自己的答案,解释实际问题。
答案 0 :(得分:2)
如果遇到启动 - 停止错误,则表示构造函数中存在错误。
试试你的ctor。您可以将错误记录到catch块中的eventlog。
除此之外,我创建一个主方法并启动win服务作为控制台应用程序。如果我在main方法中获得服务实例,我也可以调试它。
//You should select Console Application from Application properties
static void Main(string[] args)
{
MyWindowsService service = new MyWindowsService();
if (Environment.UserInteractive)
{
service.OnStart(args);
Console.WriteLine("Press any key to stop program");
Console.Read();
service.OnStop();
}
else
{
ServiceBase.Run(service);
}
}
希望帮助
答案 1 :(得分:0)
fileSystemWatcher1_Changed
事件处理程序方法执行两次的原因是因为我正在监视包含子目录的images
文件夹。此事件处理程序正在监视所有LastWrite
事件。
因此,当我更改images/prod-images
目录中的图像时,此处理程序对图像更改以及更改文件夹作出反应。
在这种情况下,我可以在更新数据库时将监视路径更改为prod-images
或插入if
语句。
这种愚蠢的错误花了我几天的时间才发现它))