private CancellationTokenSource CreateEntryListenerThread() { m_entryListenerPoller = NtCore.CreateEntryListenerPoller(Handle); CancellationTokenSource source = new CancellationTokenSource(); var ret = new Thread(() => { bool wasInterrupted = false; var token = source.Token; token.Register(() => { NtCore.CancelPollEntryListener(m_entryListenerPoller); }); while (!token.IsCancellationRequested) { var events = NtCore.PollEntryListener(m_entryListenerPoller); if (token.IsCancellationRequested) { NtCore.DisposeEntryListenerSpan(events); break; } if (events.Length == 0) { NtCore.DisposeEntryListenerSpan(events); lock (m_entryListenerWaitQueueLock) { if (m_entryListenerWaitQueue) { m_entryListenerWaitQueue = false; Monitor.PulseAll(m_entryListenerWaitQueueLock); continue; } } wasInterrupted = true; break; } for (int i = 0; i < events.Length; i++) { EntryNotificationDelegate?listener; lock (m_entryListenerLock) { m_entryListeners.TryGetValue(events.Pointer[i].listener, out listener); } if (listener != null) { listener(new RefEntryNotification(this, events.Pointer[i])); if (token.IsCancellationRequested) { break; } } } NtCore.DisposeEntryListenerSpan(events); } lock (m_entryListenerWaitQueueLock) { if (!wasInterrupted) { NtCore.DestroyEntryListenerPoller(m_entryListenerPoller); } m_entryListenerPoller = new NtEntryListenerPoller(); } }) { Name = "NTEntryListener", IsBackground = true }; ret.Start(); m_entryListenerThread = ret; return(source); }