@@ -153,7 +153,7 @@ public static void Once<T>(string eventString, Action<T> fn)
153153
154154 public static async Task < T > OnResult < T > ( string triggerEvent , string completedEvent , params object [ ] args )
155155 {
156- string eventKey = triggerEvent ;
156+ string eventKey = completedEvent ;
157157
158158 if ( args is object && args . Length > 0 ) // If there are arguments passed, we generate a unique event key with the arguments
159159 // this allow us to wait for previous events first before registering new ones
@@ -166,7 +166,7 @@ public static async Task<T> OnResult<T>(string triggerEvent, string completedEve
166166 eventKey = $ "{ eventKey } -{ ( uint ) hash . ToHashCode ( ) } ";
167167 }
168168
169- if ( EventTasks < T > . TryGetOrAdd ( triggerEvent , eventKey , out var taskCompletionSource , out var waitThisFirstAndThenTryAgain ) )
169+ if ( EventTasks < T > . TryGetOrAdd ( completedEvent , eventKey , out var taskCompletionSource , out var waitThisFirstAndThenTryAgain ) )
170170 {
171171 if ( waitThisFirstAndThenTryAgain is object )
172172 {
@@ -192,7 +192,7 @@ public static async Task<T> OnResult<T>(string triggerEvent, string completedEve
192192 {
193193 Off ( completedEvent ) ;
194194 taskCompletionSource . SetResult ( result ) ;
195- EventTasks < T > . DoneWith ( triggerEvent , eventKey , taskCompletionSource ) ;
195+ EventTasks < T > . DoneWith ( completedEvent , eventKey , taskCompletionSource ) ;
196196 } ) ;
197197
198198 Emit ( triggerEvent , args ) ;
@@ -205,21 +205,56 @@ public static async Task<T> OnResult<T>(string triggerEvent, string completedEve
205205
206206 public static async Task < T > OnResult < T > ( string triggerEvent , string completedEvent , CancellationToken cancellationToken , params object [ ] args )
207207 {
208- var taskCompletionSource = new TaskCompletionSource < T > ( TaskCreationOptions . RunContinuationsAsynchronously ) ;
208+ string eventKey = completedEvent ;
209209
210- using ( cancellationToken . Register ( ( ) => taskCompletionSource . TrySetCanceled ( ) ) )
210+ if ( args is object && args . Length > 0 ) // If there are arguments passed, we generate a unique event key with the arguments
211+ // this allow us to wait for previous events first before registering new ones
211212 {
213+ var hash = new HashCode ( ) ;
214+ foreach ( var obj in args )
215+ {
216+ hash . Add ( obj ) ;
217+ }
218+ eventKey = $ "{ eventKey } -{ ( uint ) hash . ToHashCode ( ) } ";
219+ }
220+
221+ if ( EventTasks < T > . TryGetOrAdd ( completedEvent , eventKey , out var taskCompletionSource , out var waitThisFirstAndThenTryAgain ) )
222+ {
223+ if ( waitThisFirstAndThenTryAgain is object )
224+ {
225+ //There was a pending call with different parameters, so we need to wait that first and then call here again
226+ try
227+ {
228+ await Task . Run ( ( ) => waitThisFirstAndThenTryAgain , cancellationToken ) ;
229+ }
230+ catch
231+ {
232+ //Ignore any exceptions here so we can set a new event below
233+ //The exception will also be visible to the original first caller due to taskCompletionSource.Task
234+ }
212235
213- On < T > ( completedEvent , ( result ) =>
236+ //Try again to set the event
237+ return await OnResult < T > ( triggerEvent , completedEvent , cancellationToken , args ) ;
238+ }
239+ else
214240 {
215- Off ( completedEvent ) ;
216- taskCompletionSource . SetResult ( result ) ;
217- } ) ;
241+ using ( cancellationToken . Register ( ( ) => taskCompletionSource . TrySetCanceled ( ) ) )
242+ {
243+ //A new TaskCompletionSource was added, so we need to register the completed event here
218244
219- Emit ( triggerEvent , args ) ;
245+ On < T > ( completedEvent , ( result ) =>
246+ {
247+ Off ( completedEvent ) ;
248+ taskCompletionSource . SetResult ( result ) ;
249+ EventTasks < T > . DoneWith ( completedEvent , eventKey , taskCompletionSource ) ;
250+ } ) ;
220251
221- return await taskCompletionSource . Task . ConfigureAwait ( false ) ;
252+ Emit ( triggerEvent , args ) ;
253+ }
254+ }
222255 }
256+
257+ return await taskCompletionSource . Task ;
223258 }
224259 private static SocketIO Socket
225260 {
0 commit comments