1
0
mirror of https://github.com/JKorf/CryptoExchange.Net synced 2025-06-08 00:16:27 +00:00

Threadsafe fix for socket open/close

This commit is contained in:
JKorf 2018-08-20 09:38:47 +02:00
parent b5833e5230
commit 1e83c2ded4
2 changed files with 28 additions and 10 deletions

View File

@ -7,7 +7,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>CryptoExchange.Net</PackageId> <PackageId>CryptoExchange.Net</PackageId>
<Authors>JKorf</Authors> <Authors>JKorf</Authors>
<PackageVersion>0.0.41</PackageVersion> <PackageVersion>0.0.42</PackageVersion>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance> <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<PackageProjectUrl>https://github.com/JKorf/CryptoExchange.Net</PackageProjectUrl> <PackageProjectUrl>https://github.com/JKorf/CryptoExchange.Net</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/JKorf/CryptoExchange.Net/blob/master/LICENSE</PackageLicenseUrl> <PackageLicenseUrl>https://github.com/JKorf/CryptoExchange.Net/blob/master/LICENSE</PackageLicenseUrl>

View File

@ -104,13 +104,23 @@ namespace CryptoExchange.Net.Implementation
return; return;
} }
var waitLock = new object();
log.Write(LogVerbosity.Debug, "Closing websocket"); log.Write(LogVerbosity.Debug, "Closing websocket");
ManualResetEvent evnt = new ManualResetEvent(false); ManualResetEvent evnt = new ManualResetEvent(false);
var handler = new EventHandler((o, a) => evnt.Set()); var handler = new EventHandler((o, a) =>
{
lock(waitLock)
evnt?.Set();
});
socket.Closed += handler; socket.Closed += handler;
socket.Close(); socket.Close();
evnt.WaitOne(3000); evnt.WaitOne(2000);
lock (waitLock)
{
socket.Closed -= handler; socket.Closed -= handler;
evnt.Dispose();
evnt = null;
}
log.Write(LogVerbosity.Debug, "Websocket closed"); log.Write(LogVerbosity.Debug, "Websocket closed");
} }
}).ConfigureAwait(false); }).ConfigureAwait(false);
@ -129,24 +139,32 @@ namespace CryptoExchange.Net.Implementation
lock (socketLock) lock (socketLock)
{ {
log.Write(LogVerbosity.Debug, "Connecting websocket"); log.Write(LogVerbosity.Debug, "Connecting websocket");
var waitLock = new object();
ManualResetEvent evnt = new ManualResetEvent(false); ManualResetEvent evnt = new ManualResetEvent(false);
var handler = new EventHandler((o, a) => evnt?.Set()); var handler = new EventHandler((o, a) => evnt?.Set());
var errorHandler = new EventHandler<ErrorEventArgs>((o, a) => evnt?.Set()); var errorHandler = new EventHandler<ErrorEventArgs>((o, a) =>
{
lock(waitLock)
evnt?.Set();
});
socket.Opened += handler; socket.Opened += handler;
socket.Closed += handler; socket.Closed += handler;
socket.Error += errorHandler; socket.Error += errorHandler;
socket.Open(); socket.Open();
evnt.WaitOne(TimeSpan.FromSeconds(15)); evnt.WaitOne(TimeSpan.FromSeconds(15));
lock (waitLock)
{
socket.Opened -= handler; socket.Opened -= handler;
socket.Closed -= handler; socket.Closed -= handler;
socket.Error -= errorHandler; socket.Error -= errorHandler;
evnt.Dispose();
evnt = null;
}
connected = socket.State == WebSocketState.Open; connected = socket.State == WebSocketState.Open;
if (connected) if (connected)
log.Write(LogVerbosity.Debug, "Websocket connected"); log.Write(LogVerbosity.Debug, "Websocket connected");
else else
log.Write(LogVerbosity.Debug, "Websocket connection failed, state: " + socket.State); log.Write(LogVerbosity.Debug, "Websocket connection failed, state: " + socket.State);
evnt.Dispose();
evnt = null;
} }
if (socket.State == WebSocketState.Connecting) if (socket.State == WebSocketState.Connecting)