与windows EventLog的多线程交互
本文关键字:多线程 交互 EventLog windows | 更新日期: 2023-09-27 17:49:27
我有两个进程A和b。
进程A保持每5秒写入一次EventLogEntry。
进程B应该监听EventLog对象上的EntryWritten事件,并且ASAP应该在屏幕上报告条目已经写入。
如何创建进程b (exe),它应该一直运行直到手动关闭。
请参阅以下代码片段:
class Observer
{
static void Main(string[] args)
{
EventLog log = new EventLog("logname", "MyMachine", "source");
log.EntryWritten += new EntryWrittenEventHandler(log_EntryWritten);
log.EnableRaisingEvents = true;
// The thread shouldn't exit here but wait till the event is received
// When received, should call the handler
// and then again keep waiting for next event.
}
static void log_EntryWritten(object sender, EntryWrittenEventArgs e)
{
if (e.Entry.Source == "source")
{
Console.WriteLine("Message " + e.Entry.Message);
Console.WriteLine("InstanceId " + e.Entry.InstanceId);
Console.WriteLine("Source " + e.Entry.Source);
Console.WriteLine("TimeWritten " + e.Entry.TimeWritten);
Console.ReadLine();
Console.WriteLine("'n");
}
}
}
怎么做呢?
谢谢。
您应该在log_EntryWritten
处理程序中删除对Console.ReadLine
的调用。否则将阻塞处理程序。
为了避免您的程序立即终止,您必须在Main
的末尾添加以下代码:
Console.ReadKey();
您的主标题将阻塞,直到在控制台上按下一个键。EventLog
类用于服务EventWritten
事件的线程将用于在每次新事件到达时执行处理程序。不过你得研究一下"事件"里的这句话。EventWritten事件,包含有关5秒要求的一些信息:
如果最后一个写事件发生在至少6秒之前,系统才会响应WriteEntry。这意味着您将在6秒间隔内只收到一个EntryWritten事件通知,即使发生了多个事件日志更改。如果在对WriteEntry的调用之间插入足够长的睡眠间隔(大约10秒),就不太可能错过一个事件。但是,如果写事件发生得更频繁,您可能要到下一个时间间隔才会收到事件通知。通常,错过的事件通知不会丢失,但会延迟。
您可以尝试这样简单的操作:
static void Main(string[] args)
{
EventLog log = new EventLog("logname", "MyMachine", "source");
log.EntryWritten += new EntryWrittenEventHandler(log_EntryWritten);
log.EnableRaisingEvents = true;
//Wait for a key to be pressed.
Console.ReadKey();
}