Skip to content

Commit 4c3065c

Browse files
committed
SocketIOFacade: Synchronize un/registration of events
1 parent 2a6d211 commit 4c3065c

File tree

1 file changed

+40
-21
lines changed

1 file changed

+40
-21
lines changed

src/ElectronNET.API/Bridge/SocketIOFacade.cs

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ namespace ElectronNET.API;
1212
internal class SocketIoFacade
1313
{
1414
private readonly SocketIO _socket;
15+
private readonly object _lockObj = new object();
1516

1617
public SocketIoFacade(string uri)
1718
{
@@ -54,53 +55,71 @@ public void Connect()
5455

5556
public void On(string eventName, Action action)
5657
{
57-
_socket.On(eventName, _ =>
58+
lock (_lockObj)
5859
{
59-
Task.Run(action);
60-
});
60+
_socket.On(eventName, _ =>
61+
{
62+
Task.Run(action);
63+
});
64+
}
6165
}
6266

6367
public void On<T>(string eventName, Action<T> action)
6468
{
65-
_socket.On(eventName, response =>
69+
lock (_lockObj)
6670
{
67-
var value = response.GetValue<T>();
68-
Task.Run(() => action(value));
69-
});
71+
_socket.On(eventName, response =>
72+
{
73+
var value = response.GetValue<T>();
74+
Task.Run(() => action(value));
75+
});
76+
}
7077
}
7178

7279
// TODO: Remove this method when SocketIoClient supports object deserialization
7380
public void On(string eventName, Action<object> action)
7481
{
75-
_socket.On(eventName, response =>
82+
lock (_lockObj)
7683
{
77-
var value = response.GetValue<object>();
78-
////Console.WriteLine($"Called Event {eventName} - data {value}");
79-
Task.Run(() => action(value));
80-
});
84+
_socket.On(eventName, response =>
85+
{
86+
var value = response.GetValue<object>();
87+
////Console.WriteLine($"Called Event {eventName} - data {value}");
88+
Task.Run(() => action(value));
89+
});
90+
}
8191
}
8292

8393
public void Once(string eventName, Action action)
8494
{
85-
_socket.On(eventName, _ =>
95+
lock (_lockObj)
8696
{
87-
_socket.Off(eventName);
88-
Task.Run(action);
89-
});
97+
_socket.On(eventName, _ =>
98+
{
99+
_socket.Off(eventName);
100+
Task.Run(action);
101+
});
102+
}
90103
}
91104

92105
public void Once<T>(string eventName, Action<T> action)
93106
{
94-
_socket.On(eventName, (socketIoResponse) =>
107+
lock (_lockObj)
95108
{
96-
_socket.Off(eventName);
97-
Task.Run(() => action(socketIoResponse.GetValue<T>()));
98-
});
109+
_socket.On(eventName, (socketIoResponse) =>
110+
{
111+
_socket.Off(eventName);
112+
Task.Run(() => action(socketIoResponse.GetValue<T>()));
113+
});
114+
}
99115
}
100116

101117
public void Off(string eventName)
102118
{
103-
_socket.Off(eventName);
119+
lock (_lockObj)
120+
{
121+
_socket.Off(eventName);
122+
}
104123
}
105124

106125
public async Task Emit(string eventName, params object[] args)

0 commit comments

Comments
 (0)