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:
parent
b5833e5230
commit
1e83c2ded4
@ -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>
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user