下面的代码在"...has已注册为本地计算机上的源“时失败,尽管我首先要进行检查:
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和Windows764编译到任何CPU。
编辑:更新代码以获得常量到局部变量以检查它们没有更改,并使用锁定来确保只有一个线程可以测试和创建。同样的错误,代码仍然失败。
发布于 2010-07-22 10:06:34
在深入Sysinternals进程监视器之后发现了这个问题:
调用EventLog.Exists("MyLog");
未找到日志名称,如以下中所期望的那样:
KLM\System\CurrentControlSet\services\eventlog\MyLog
调用EventLog.SourceExists("MySource");
检查几个地方,在预期中找不到名称:
HKLM\System\CurrentControlSet\services\eventlog\Application\MySource
HKLM\System\CurrentControlSet\services\eventlog\HardwareEvents\MySource
HKLM\System\CurrentControlSet\services\eventlog\Internet资源管理器\MySource
HKLM\System\CurrentControlSet\services\eventlog\Key管理服务\MySource
HKLM\System\CurrentControlSet\services\eventlog\Media中心\MySource
HKLM\System\CurrentControlSet\services\eventlog\ODiag\MySource
HKLM\System\CurrentControlSet\services\eventlog\OSession\MySource
HKLM\System\CurrentControlSet\services\eventlog\Security\MySource
HKLM\System\CurrentControlSet\services\eventlog\System\MySource
HKLM\System\CurrentControlSet\services\eventlog\VisualSVNServer\MySource
HKLM\System\CurrentControlSet\services\eventlog\Windows PowerShell\MySource
HKLM\System\CurrentControlSet\services\eventlog\Application\MySource
HKLM\System\CurrentControlSet\services\eventlog\HardwareEvents\MySource
HKLM\System\CurrentControlSet\services\eventlog\Internet资源管理器\MySource
HKLM\System\CurrentControlSet\services\eventlog\Key管理服务\MySource
HKLM\System\CurrentControlSet\services\eventlog\Media中心\MySource
HKLM\System\CurrentControlSet\services\eventlog\ODiag\MySource
HKLM\System\CurrentControlSet\services\eventlog\OSession\MySource
HKLM\System\CurrentControlSet\services\eventlog\Security\MySource
HKLM\System\CurrentControlSet\services\eventlog\System\MySource
HKLM\System\CurrentControlSet\services\eventlog\VisualSVNServer\MySource
HKLM\System\CurrentControlSet\services\eventlog\Windows PowerShell\MySource
HKLM\System\CurrentControlSet\services\eventlog\MyLog
但是,调用EventLog.CreateEventSource("MySource", "MyLog");
在以下注册表位置和错误中查找MyLog:
HKLM\System\CurrentControlSet\services\eventlog\Application\MyLog
删除"HKLM\System\CurrentControlSet\services\eventlog\Application\MyLog“并重新运行解决了我的问题!
看起来.Exists并不是.CreateEvent做的所有地方都看得到!
发布于 2010-07-22 09:17:31
//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的修改。
https://stackoverflow.com/questions/3307151
复制相似问题