Eil*_*idh 7 .net c# thread-safety event-log
我的应用程序需要在它们进入时检查所有新的应用程序事件日志条目.
private void eventLog_Application_EntryWritten(object sender, EntryWrittenEventArgs e)
{
// Process e.Entry
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是,如果在处理前一个条目时将另一个条目写入EventLog会发生什么?
EventLog.EntryWritten Event的文档提供了一个处理使用线程的条目写入事件的示例(这就是我提出问题的原因).
在这个例子中,他们使用System.Threading并调用类上的WaitOne()和Set()方法AutoResetEvent,但是我不确定这个代码的目的是什么.
该文档指出 - WaitOne()"阻止当前线程直到当前WaitHandle接收到信号",并且Set()"将事件的状态设置为发信号,允许一个或多个等待线程继续".我不确定这个例子的线程部分是什么意图,以及它如何与实际应用(或如果)相关联.
看起来WaitOne()在写入条目之后立即阻塞线程,直到它被处理,然后Set()在允许线程继续之前将其设置为发信号(使用).这是应用程序的唯一线程吗?
最重要的是,当我的应用程序是不负责写这需要从事件日志读取事件,如何把这个原则应用?(如果确实需要应用它.)
如果Entry在应用程序位于处理程序内部时写入新内容会发生什么?
没有任何戏剧性的事情发生,它是由框架序列化的.触发EventWritten事件的基础winapi函数是NotifyChangeEventLog()..NET Framework使用线程池来监视事件以通过ThreadPool.RegisterWaitForSingleObject()发出信号.你可以在这里看到它被使用.
这是MSDN示例使用ARE(AutoResetEvent)的原因.事件处理程序在该线程池线程上运行,恰好在发生这种情况时是不可预测的.该示例使用控制台模式应用程序,没有它会立即终止.使用ARE,它会显示一个通知并退出.当然不是那么有用,我个人只是在示例中使用了Console.ReadLine(),因此它只是继续运行并继续显示信息,直到您按Enter键.
如果您使用服务或GUI应用程序,那么您不需要这样做,这将在用户明确关闭之前运行很长时间.注意EventLog.SynchronizingObject属性,可以轻松地在Winforms应用程序中处理线程池线程.