@@ -26,7 +26,7 @@ private struct Handler
2626
2727 private class HandlersList : IEnumerable < Handler >
2828 {
29- private List < Handler > _handlers = new List < Handler > ( ) ;
29+ private readonly List < Handler > _handlers = new List < Handler > ( ) ;
3030
3131 public void Add ( ScriptDrivenObject target , string methodName )
3232 {
@@ -58,7 +58,10 @@ IEnumerator IEnumerable.GetEnumerator()
5858 }
5959 }
6060
61- private Dictionary < IRuntimeContextInstance , Dictionary < string , HandlersList > > _registeredHandlers = new Dictionary < IRuntimeContextInstance , Dictionary < string , HandlersList > > ( ) ;
61+ private readonly Dictionary < IRuntimeContextInstance , Dictionary < string , HandlersList > > _registeredHandlers
62+ = new Dictionary < IRuntimeContextInstance , Dictionary < string , HandlersList > > ( ) ;
63+
64+ private readonly object _subscriptionLock = new object ( ) ;
6265
6366 public void AddHandler (
6467 IRuntimeContextInstance eventSource ,
@@ -68,19 +71,23 @@ public void AddHandler(
6871 {
6972 if ( ! ( handlerTarget is ScriptDrivenObject handlerScript ) )
7073 throw RuntimeException . InvalidArgumentType ( "handlerTarget" ) ;
71-
72- if ( ! _registeredHandlers . TryGetValue ( eventSource , out var handlers ) )
74+
75+ lock ( _subscriptionLock )
7376 {
74- handlers = new Dictionary < string , HandlersList > ( ) ;
75- _registeredHandlers [ eventSource ] = handlers ;
76- }
77-
78- if ( ! handlers . TryGetValue ( eventName , out var handlersList ) ) {
79- handlersList = new HandlersList ( ) ;
80- handlers [ eventName ] = handlersList ;
77+ if ( ! _registeredHandlers . TryGetValue ( eventSource , out var handlers ) )
78+ {
79+ handlers = new Dictionary < string , HandlersList > ( ) ;
80+ _registeredHandlers [ eventSource ] = handlers ;
81+ }
82+
83+ if ( ! handlers . TryGetValue ( eventName , out var handlersList ) )
84+ {
85+ handlersList = new HandlersList ( ) ;
86+ handlers [ eventName ] = handlersList ;
87+ }
88+
89+ handlersList . Add ( handlerScript , handlerMethod ) ;
8190 }
82-
83- handlersList . Add ( handlerScript , handlerMethod ) ;
8491 }
8592
8693 public void RemoveHandler (
@@ -92,26 +99,37 @@ public void RemoveHandler(
9299 if ( ! ( handlerTarget is ScriptDrivenObject handlerScript ) )
93100 throw RuntimeException . InvalidArgumentType ( "handlerTarget" ) ;
94101
95- if ( ! _registeredHandlers . TryGetValue ( eventSource , out var handlers ) )
102+ lock ( _subscriptionLock )
96103 {
97- return ;
98- }
99-
100- if ( handlers . TryGetValue ( eventName , out var handlersList ) ) {
101- handlersList . Remove ( handlerScript , handlerMethod ) ;
104+ if ( ! _registeredHandlers . TryGetValue ( eventSource , out var handlers ) )
105+ {
106+ return ;
107+ }
108+
109+ if ( handlers . TryGetValue ( eventName , out var handlersList ) )
110+ {
111+ handlersList . Remove ( handlerScript , handlerMethod ) ;
112+ }
102113 }
103114 }
104115
105116 public void HandleEvent ( IRuntimeContextInstance eventSource , string eventName , IValue [ ] eventArgs )
106117 {
107- if ( ! _registeredHandlers . TryGetValue ( eventSource , out var handlers ) )
108- return ;
109-
110- if ( ! handlers . TryGetValue ( eventName , out var handlersList ) ) {
111- return ;
118+ HandlersList handlersLocalCopy ;
119+
120+ lock ( _subscriptionLock )
121+ {
122+
123+ if ( ! _registeredHandlers . TryGetValue ( eventSource , out var handlers ) )
124+ return ;
125+
126+ if ( ! handlers . TryGetValue ( eventName , out handlersLocalCopy ) )
127+ {
128+ return ;
129+ }
112130 }
113-
114- foreach ( var handler in handlersList )
131+
132+ foreach ( var handler in handlersLocalCopy )
115133 {
116134 handler . Method ( eventArgs ) ;
117135 }
0 commit comments