即使我正在检查,也从EventLog.CreateEventSource接收“…已经注册…”!EventLog.SourceExists

我的以下代码失败,“…已经在本地计算机上注册为源”,即使我先做检查:

lock ( eventLock ) { string eventLog = Constants.EventLogPL; string eventSrc = Constants.EventSrcPL; if (!EventLog.Exists(eventLog)) { if (!EventLog.SourceExists(eventSrc)) { try { EventLog.CreateEventSource(eventSrc, eventLog); } catch (Exception e) { System.Diagnostics.Debug.WriteLine(e.Message); } } } } 

我以为我的调用!EventLog.SourceExists足以防止我的错误! 我正在使用2010 .NET 4和Windows 7 64编译到任何CPU。

编辑:更新代码以获取本地常量以检查它们是否未更改,并使用锁定以确保只有一个线程可以测试和创建。 代码仍然失败并出现相同的错误。

在深入了解Sysinternals的Process Monitor后发现了这个问题:

调用EventLog.Exists("MyLog");

找不到日志名称,如预期的那样:

KLM \系统\ CurrentControlSet \服务\事件日志\ MyLog

调用EventLog.SourceExists("MySource");

检查几个地方,找不到预期的名称:

HKLM \系统\ CurrentControlSet \服务\事件日志\应用程序\ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\ HardwareEvents \ MYSOURCE
HKLM \ System \ CurrentControlSet \ services \ eventlog \ Internet Explorer \ MySource
HKLM \ System \ CurrentControlSet \ services \ eventlog \ Key Management Service \ MySource
HKLM \ System \ CurrentControlSet \ services \ eventlog \ Media Center \ MySource
HKLM \系统\ CurrentControlSet \服务\事件日志\ ODIAG \ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\ OSession \ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\安全\ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\ SYSTEM \ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\ VisualSVNServer \ MYSOURCE
HKLM \ System \ CurrentControlSet \ services \ eventlog \ Windows PowerShell \ MySource
HKLM \系统\ CurrentControlSet \服务\事件日志\应用程序\ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\ HardwareEvents \ MYSOURCE
HKLM \ System \ CurrentControlSet \ services \ eventlog \ Internet Explorer \ MySource
HKLM \ System \ CurrentControlSet \ services \ eventlog \ Key Management Service \ MySource
HKLM \ System \ CurrentControlSet \ services \ eventlog \ Media Center \ MySource
HKLM \系统\ CurrentControlSet \服务\事件日志\ ODIAG \ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\ OSession \ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\安全\ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\ SYSTEM \ MYSOURCE
HKLM \系统\ CurrentControlSet \服务\事件日志\ VisualSVNServer \ MYSOURCE
HKLM \ System \ CurrentControlSet \ services \ eventlog \ Windows PowerShell \ MySource
HKLM \系统\ CurrentControlSet \服务\事件日志\ MyLog

但是,调用EventLog.CreateEventSource("MySource", "MyLog");

在以下注册表位置和错误中查找MyLog:

HKLM \系统\ CurrentControlSet \服务\事件日志\应用程序\ MyLog

删除“HKLM \ System \ CurrentControlSet \ services \ eventlog \ Application \ MyLog”并重新运行修复了我的问题!

看起来.Exists不会查看所有的地方.CreateEvent呢!

 //0 for false, 1 for true. private static int usingResource = 0; if (!EventLog.SourceExists(Constants.EventSrcPL)) { //0 indicates that the method is not in use. if (0 == Interlocked.Exchange(ref usingResource, 1)) { if (!EventLog.SourceExists(Constants.EventSrcPL)) { try { EventLog.CreateEventSource(Constants.EventSrcPL, Constants.EventLogPL); } catch (Exception e) { System.Diagnostics.Debug.WriteLine(e.Message); //Release the lock Interlocked.Exchange(ref usingResource, 0); } } } } else { usingResource = 0; } 

在您访问事件日志的确切时间内由其他应用程序创建源时,无法解决问题。

编辑 :进行了修改,以解释EventSource的延迟创建。