From 4c3065c64b86d1c611bc25ab024d3d758df7d28e Mon Sep 17 00:00:00 2001 From: softworkz Date: Fri, 7 Nov 2025 03:49:42 +0100 Subject: [PATCH] SocketIOFacade: Synchronize un/registration of events --- src/ElectronNET.API/Bridge/SocketIOFacade.cs | 61 +++++++++++++------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/src/ElectronNET.API/Bridge/SocketIOFacade.cs b/src/ElectronNET.API/Bridge/SocketIOFacade.cs index c3815d6..6432417 100644 --- a/src/ElectronNET.API/Bridge/SocketIOFacade.cs +++ b/src/ElectronNET.API/Bridge/SocketIOFacade.cs @@ -12,6 +12,7 @@ using SocketIO = SocketIOClient.SocketIO; internal class SocketIoFacade { private readonly SocketIO _socket; + private readonly object _lockObj = new object(); public SocketIoFacade(string uri) { @@ -54,53 +55,71 @@ internal class SocketIoFacade public void On(string eventName, Action action) { - _socket.On(eventName, _ => + lock (_lockObj) { - Task.Run(action); - }); + _socket.On(eventName, _ => + { + Task.Run(action); + }); + } } public void On(string eventName, Action action) { - _socket.On(eventName, response => + lock (_lockObj) { - var value = response.GetValue(); - Task.Run(() => action(value)); - }); + _socket.On(eventName, response => + { + var value = response.GetValue(); + Task.Run(() => action(value)); + }); + } } // TODO: Remove this method when SocketIoClient supports object deserialization public void On(string eventName, Action action) { - _socket.On(eventName, response => + lock (_lockObj) { - var value = response.GetValue(); - ////Console.WriteLine($"Called Event {eventName} - data {value}"); - Task.Run(() => action(value)); - }); + _socket.On(eventName, response => + { + var value = response.GetValue(); + ////Console.WriteLine($"Called Event {eventName} - data {value}"); + Task.Run(() => action(value)); + }); + } } public void Once(string eventName, Action action) { - _socket.On(eventName, _ => + lock (_lockObj) { - _socket.Off(eventName); - Task.Run(action); - }); + _socket.On(eventName, _ => + { + _socket.Off(eventName); + Task.Run(action); + }); + } } public void Once(string eventName, Action action) { - _socket.On(eventName, (socketIoResponse) => + lock (_lockObj) { - _socket.Off(eventName); - Task.Run(() => action(socketIoResponse.GetValue())); - }); + _socket.On(eventName, (socketIoResponse) => + { + _socket.Off(eventName); + Task.Run(() => action(socketIoResponse.GetValue())); + }); + } } public void Off(string eventName) { - _socket.Off(eventName); + lock (_lockObj) + { + _socket.Off(eventName); + } } public async Task Emit(string eventName, params object[] args)