private int _handledOnWindowClosed = 0; //!!! temporal: OnWindowClosed fired twice void mainWindow_Closed(object sender, EventArgs e) { if (_handledOnWindowClosed++ > 0) { return; } Console.WriteLine(">>>> OnWindowClosed <<<<"); // stop render thread lock (_renderLock) { _closingWindow = true; } _eventRenderDoWork.Set(); // unblock RenderThread() _threadRender.Join(); _threadRender = null; SaveAppSettings(); _mainBitmap.DisposeAll(); // Sound #if USE_MIDI if (_midiPlayer != null) { _midiPlayer.StopClock(); _midiPlayer.Dispose(); _midiPlayer = null; } #endif #if USE_WAVE if (_waveEngine != null) { _waveEngine.Stop(); _waveEngine.Dispose(); _waveEngine = null; } #endif #if USE_PERF Console.WriteLine("Performance counters"); Console.WriteLine(_perfUpdateItems.GetReport()); Console.WriteLine(_perfDrawItems.GetReport()); Console.WriteLine(_perfRenderImage.GetReport()); Console.WriteLine(_perfCopyPixels.GetReport()); #endif }