Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 接收;。。。已注册……”;从EventLog.CreateEventSource,即使I';我查对了!EventLog.SourceExists_C#_.net_.net 4.0_Event Log - Fatal编程技术网

C# 接收;。。。已注册……”;从EventLog.CreateEventSource,即使I';我查对了!EventLog.SourceExists

C# 接收;。。。已注册……”;从EventLog.CreateEventSource,即使I';我查对了!EventLog.SourceExists,c#,.net,.net-4.0,event-log,C#,.net,.net 4.0,Event Log,我的以下代码因“…已在本地计算机上注册为源代码”而失败,即使我先进行检查: lock ( eventLock ) { string eventLog = Constants.EventLogPL; string eventSrc = Constants.EventSrcPL; if (!EventLog.Exists(eventLog)) { if (!EventLog.SourceExists(eventSrc)) {

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

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.NET4和Windows764编译到任何CPU

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

//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;
}
当源在访问事件日志的确切时间内由其他应用程序创建时,无法解决此问题


已编辑:对延迟创建的
事件源进行了修改

在深入了解以下内容后发现问题:

调用
EventLog.Exists(“MyLog”)

未找到日志名称,如中所预期:

KLM\System\CurrentControlSet\services\eventlog\MyLog

调用
EventLog.SourceExists(“MySource”)

检查多个位置,未按预期在中找到名称:

HKLM\System\CurrentControlSet\services\eventlog\Application\MySource
HKLM\System\CurrentControlSet\services\eventlog\HardwareeEvents\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\HardwareeEvents\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

这是一个多线程应用程序吗?是的,但是我添加了代码来写出
常量。EventLogPL
常量。EventSrcPL
在每个Exists和CreateEventSource之前/之后,只是为了检查值没有改变。我编辑了我的代码,将
常量
存储在局部变量中,并使用锁来保护线程问题,同样的错误。我甚至使用SysInternals进程监视器来检查发生了什么;到目前为止,只有name未找到(预期)和Success-当我跳过
EventLog.CreateEventSource(eventSrc,EventLog)时没有错误这是我所期望的。在我的情况下,不要将源命名为与服务相同的名称,它将抛出这些错误。我的代码中有一个断点,因此没有看到线程问题,但我添加了一个
锁(…)
以保护测试/创建类似于您的
联锁的。Exchange
但我仍然看到错误。@JLWarlow:创建资源需要一些时间。因此,如果执行代码两次,可能会出现异常。我已经修改了代码来解释这个问题。我支持这个。Jaroslav Jandek-这是在后续运行的测试环境中发生的,因此没有并发的机会。我认为这是在最初运行代码并创建日志和源代码之后更改正在使用的日志和/或源名称的副作用。似乎把检测弄糊涂了。好吧,实际上我想我已经解决了。最初,我设置了一个名为x的源和一个名为y的日志。随后,我将日志更改为名称x,将源更改为名称z。我收到错误是因为该类不允许我注册与现有eventsource同名的新eventlog。为了解决这个问题,我运行了EventLog.DeleteEventSource(x);首先,一旦过时的源代码消失,问题就结束了。谢谢!这很有帮助。在“HKLM\System\CurrentControlSet\services\eventlog\Application”中有一个重复条目,但该条目未显示在事件日志列表中。删除重复的注册表项后,错误消失,事件日志创建成功-Bala