Though we should definitely see why that happened
The IndexReader.NotifyReaderClosedListeners() did not properly suppress the exceptions thrown from the call to listener.OnClose(). Unfortunately there is no place to track the suppressed exception so it is just dropped. Changing to return AggregateException will change the type and cause problems later for flow control.
The java version uses a concurrent hash map so I updated VirtualMethod to use that. After that change, we no longer needed the lock on the Reap() function. Next the Get() needed to use a tryGet() and return the default if there was nothing in the collection.
Use the C# ThreadInterruptedException so the catches will properly control the flow during interruption. This fixes the two unit tests Lucene.Next.Index.TestIndexWriter.TestThreadInterruptDeadlock and Lucene.Next.Index.TestIndexWriter.TestTwoThreadsInterruptDeadlock Lucene uses the ThreadInterruptedException for code flow control so it is important to use the C# ThreadInterruptedException to avoid duplicating the catch everywhere and preserve the flow.