diff --git a/src/ElectronNET.API/API/App.cs b/src/ElectronNET.API/API/App.cs index a184303..0e92803 100644 --- a/src/ElectronNET.API/API/App.cs +++ b/src/ElectronNET.API/API/App.cs @@ -427,7 +427,7 @@ namespace ElectronNET.API public void DisposeSocket() { - BridgeConnector.Socket.DisposeSocket(); + BridgeConnector.Socket.Dispose(); } /// diff --git a/src/ElectronNET.API/Bridge/SocketIOFacade.cs b/src/ElectronNET.API/Bridge/SocketIOFacade.cs index 4db0a0b..86d870e 100644 --- a/src/ElectronNET.API/Bridge/SocketIOFacade.cs +++ b/src/ElectronNET.API/Bridge/SocketIOFacade.cs @@ -8,10 +8,11 @@ using ElectronNET.API.Serialization; using SocketIO.Serializer.SystemTextJson; using SocketIO = SocketIOClient.SocketIO; -internal class SocketIoFacade +internal class SocketIoFacade : IDisposable { private readonly SocketIO _socket; private readonly object _lockObj = new object(); + private bool _isDisposed; public SocketIoFacade(string uri) { @@ -27,6 +28,8 @@ internal class SocketIoFacade public void Connect() { + this.CheckDisposed(); + _socket.OnError += (sender, e) => { Console.WriteLine($"BridgeConnector Error: {sender} {e}"); }; _socket.OnConnected += (_, _) => @@ -46,6 +49,8 @@ internal class SocketIoFacade public void On(string eventName, Action action) { + this.CheckDisposed(); + lock (_lockObj) { _socket.On(eventName, _ => { Task.Run(action); }); @@ -54,6 +59,8 @@ internal class SocketIoFacade public void On(string eventName, Action action) { + this.CheckDisposed(); + lock (_lockObj) { _socket.On(eventName, response => @@ -66,6 +73,8 @@ internal class SocketIoFacade public void Once(string eventName, Action action) { + this.CheckDisposed(); + lock (_lockObj) { _socket.On(eventName, _ => @@ -78,6 +87,8 @@ internal class SocketIoFacade public void Once(string eventName, Action action) { + this.CheckDisposed(); + lock (_lockObj) { _socket.On(eventName, (socketIoResponse) => @@ -90,6 +101,11 @@ internal class SocketIoFacade public void Off(string eventName) { + if (_isDisposed) + { + return; + } + lock (_lockObj) { _socket.Off(eventName); @@ -98,11 +114,33 @@ internal class SocketIoFacade public async Task Emit(string eventName, params object[] args) { - await _socket.EmitAsync(eventName, args).ConfigureAwait(false); + if (!_isDisposed) + { + await _socket.EmitAsync(eventName, args).ConfigureAwait(false); + } } - public void DisposeSocket() + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + public void Dispose() { - _socket.Dispose(); + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + _isDisposed = true; + _socket.Dispose(); + } + } + + private void CheckDisposed() + { + if (this._isDisposed) + { + throw new ObjectDisposedException(nameof(SocketIoFacade)); + } } } \ No newline at end of file diff --git a/src/ElectronNET.API/Runtime/Services/SocketBridge/SocketBridgeService.cs b/src/ElectronNET.API/Runtime/Services/SocketBridge/SocketBridgeService.cs index 23ca4d8..7e8be64 100644 --- a/src/ElectronNET.API/Runtime/Services/SocketBridge/SocketBridgeService.cs +++ b/src/ElectronNET.API/Runtime/Services/SocketBridge/SocketBridgeService.cs @@ -33,7 +33,7 @@ protected override Task StopCore() { - this.socket.DisposeSocket(); + this.socket.Dispose(); return Task.CompletedTask; }