@@ -8,25 +8,26 @@ namespace AlphaTab.Platform.CSharp;
88internal abstract class ManagedThreadWorkerBase < T > : IAlphaTabWorker < T >
99{
1010 private readonly Action < Action > _postToMain ;
11- private readonly Thread _workerThread ;
1211 private readonly BlockingCollection < Action > _workerQueue ;
1312 private readonly CancellationTokenSource _workerCancellationToken ;
1413 private readonly ManualResetEventSlim ? _threadStartedEvent ;
1514 private readonly ConcurrentDictionary < Action < MessageEvent < T > > , Action < MessageEvent < T > > > _listenerInsideWorker = new ( ) ;
1615 private readonly ConcurrentDictionary < Action < MessageEvent < T > > , Action < MessageEvent < T > > > _listenerOutsideWorker = new ( ) ;
1716
17+ protected Thread WorkerThread { get ; }
18+
1819 protected ManagedThreadWorkerBase ( Action < Action > postToMain )
1920 {
2021 _postToMain = postToMain ;
2122 _threadStartedEvent = new ManualResetEventSlim ( false ) ;
2223 _workerQueue = new BlockingCollection < Action > ( ) ;
2324 _workerCancellationToken = new CancellationTokenSource ( ) ;
2425
25- _workerThread = new Thread ( DoWork )
26+ WorkerThread = new Thread ( DoWork )
2627 {
2728 IsBackground = true
2829 } ;
29- _workerThread . Start ( ) ;
30+ WorkerThread . Start ( ) ;
3031
3132 _threadStartedEvent . Wait ( ) ;
3233 _threadStartedEvent . Dispose ( ) ;
@@ -55,7 +56,7 @@ private void DoWork()
5556 public void PostMessage ( T message )
5657 {
5758 var ev = new MessageEvent < T > ( message ) ;
58- if ( Thread . CurrentThread . ManagedThreadId == _workerThread . ManagedThreadId )
59+ if ( Thread . CurrentThread . ManagedThreadId == WorkerThread . ManagedThreadId )
5960 {
6061 // Inside Worker -> Post to main
6162 _postToMain ( ( ) =>
@@ -87,7 +88,7 @@ public void PostToWorker(Action action)
8788 public void AddEventListener ( string @event , Action < MessageEvent < T > > handler )
8889 {
8990 if ( @event != "message" ) return ;
90- var listeners = Thread . CurrentThread . ManagedThreadId == _workerThread . ManagedThreadId
91+ var listeners = Thread . CurrentThread . ManagedThreadId == WorkerThread . ManagedThreadId
9192 ? _listenerInsideWorker
9293 : _listenerOutsideWorker ;
9394 listeners [ handler ] = handler ;
@@ -96,7 +97,7 @@ public void AddEventListener(string @event, Action<MessageEvent<T>> handler)
9697 public void RemoveEventListener ( string @event , Action < MessageEvent < T > > handler )
9798 {
9899 if ( @event != "message" ) return ;
99- var listeners = Thread . CurrentThread . ManagedThreadId == _workerThread . ManagedThreadId
100+ var listeners = Thread . CurrentThread . ManagedThreadId == WorkerThread . ManagedThreadId
100101 ? _listenerInsideWorker
101102 : _listenerOutsideWorker ;
102103 listeners . TryRemove ( handler , out _ ) ;
@@ -105,7 +106,7 @@ public void RemoveEventListener(string @event, Action<MessageEvent<T>> handler)
105106 public virtual void Terminate ( )
106107 {
107108 _workerCancellationToken . Cancel ( ) ;
108- _workerThread . Join ( ) ;
109+ WorkerThread . Join ( ) ;
109110 while ( _workerQueue . Count > 0 )
110111 {
111112 _workerQueue . Take ( ) ;
@@ -133,6 +134,12 @@ protected override void OnStartInsideWorker()
133134 WorkerLookup [ Thread . CurrentThread . ManagedThreadId ] = this ;
134135 AlphaTabWebWorker . Init ( ) ;
135136 }
137+
138+ public override void Terminate ( )
139+ {
140+ base . Terminate ( ) ;
141+ WorkerLookup . TryRemove ( WorkerThread . ManagedThreadId , out _ ) ;
142+ }
136143}
137144
138145internal class ManagedThreadAlphaSynthWorker :
@@ -155,4 +162,10 @@ protected override void OnStartInsideWorker()
155162 WorkerLookup [ Thread . CurrentThread . ManagedThreadId ] = this ;
156163 AlphaSynthWebWorker . Init ( ) ;
157164 }
165+
166+ public override void Terminate ( )
167+ {
168+ base . Terminate ( ) ;
169+ WorkerLookup . TryRemove ( WorkerThread . ManagedThreadId , out _ ) ;
170+ }
158171}
0 commit comments