首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >收到"...has已经注册.“虽然我在查EventLog.CreateEventSource !EventLog.SourceExists

收到"...has已经注册.“虽然我在查EventLog.CreateEventSource !EventLog.SourceExists
EN

Stack Overflow用户
提问于 2010-07-22 08:47:37
回答 2查看 7.5K关注 0票数 10

下面的代码在"...has已注册为本地计算机上的源“时失败,尽管我首先要进行检查:

代码语言:javascript
复制
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。

编辑:更新代码以获得常量到局部变量以检查它们没有更改,并使用锁定来确保只有一个线程可以测试和创建。同样的错误,代码仍然失败。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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做的所有地方都看得到!

票数 22
EN

Stack Overflow用户

发布于 2010-07-22 09:17:31

代码语言:javascript
复制
//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的修改。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3307151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档