From ee3aabca354fcd12621634e6110f486130a190f6 Mon Sep 17 00:00:00 2001 From: Robert Rodgers Date: Fri, 5 Sep 2025 13:37:23 +0200 Subject: [PATCH] Fixed concurrent collection access crash --- Whisper.net/WhisperProcessor.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Whisper.net/WhisperProcessor.cs b/Whisper.net/WhisperProcessor.cs index a56aca2a5..e9fc49bc5 100755 --- a/Whisper.net/WhisperProcessor.cs +++ b/Whisper.net/WhisperProcessor.cs @@ -229,7 +229,10 @@ bool OnWhisperAbortHandler() try { - options.OnSegmentEventHandlers.Add(OnSegmentHandler); + lock (options.OnSegmentEventHandlers) + { + options.OnSegmentEventHandlers.Add(OnSegmentHandler); + } options.WhisperAbortEventHandler = OnWhisperAbortHandler; currentCancellationToken = cancellationToken; @@ -261,7 +264,10 @@ await Task.WhenAny(whisperTask, resetEvent.WaitAsync()) } finally { - options.OnSegmentEventHandlers.Remove(OnSegmentHandler); + lock (options.OnSegmentEventHandlers) + { + options.OnSegmentEventHandlers.Remove(OnSegmentHandler); + } } } @@ -776,7 +782,9 @@ private void OnNewSegment(IntPtr state) language!, tokens); - foreach (var handler in options.OnSegmentEventHandlers) + OnSegmentEventHandler[] handlers; + lock (options.OnSegmentEventHandlers) { handlers = options.OnSegmentEventHandlers.ToArray(); } + foreach (var handler in handlers) { handler?.Invoke(eventHandlerArgs); if (currentCancellationToken.HasValue && currentCancellationToken.Value.IsCancellationRequested)