Мой после сбоев кода с "... был уже зарегистрирован как источник на локальном компьютере" даже при том, что я делаю проверки сначала:
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
был бы достаточно для предотвращения моей ошибки! Я нахожусь на.NET 2010 4 и компиляция Windows 7 64 в любой ЦП.
Править: Обновленный код, чтобы заставить Constant местным жителям проверять они не изменяются, и блокировка использования, чтобы удостовериться, что только один поток может протестировать и создать. Код все еще перестал работать с той же ошибкой.
Нашел проблему, покопавшись еще немного в Sysinternals' Process Monitor:
Вызываю 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 Explorer\MySource
HKLM\System\CurrentControlSet\services\eventlog\Key Management Service\MySource
HKLM\System\CurrentControlSet\services\eventlog\Media Center\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 Explorer\MySource
HKLM\System\CurrentControlSet\services\eventlog\Key Management Service\MySource
HKLM\System\CurrentControlSet\services\eventlog\Media Center\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
!
//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
.