1
0
mirror of https://github.com/JKorf/CryptoExchange.Net synced 2025-06-07 16:06:15 +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>
<PackageId>CryptoExchange.Net</PackageId>
<Authors>JKorf</Authors>
<PackageVersion>0.0.41</PackageVersion>
<PackageVersion>0.0.42</PackageVersion>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<PackageProjectUrl>https://github.com/JKorf/CryptoExchange.Net</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/JKorf/CryptoExchange.Net/blob/master/LICENSE</PackageLicenseUrl>

View File

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