我的以下代码失败,“...已经在本地计算机上注册为源”,即使我先做检查:
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。
编辑:更新了代码以获取本地常量以检查它们是否未更改,并使用锁定以确保只有一个线程可以测试和创建。代码仍然失败并出现相同的错误。
答案 0 :(得分:22)
在深入了解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
所有位置!
答案 1 :(得分:2)
//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
的延迟创建。