mirror of
https://github.com/JKorf/CryptoExchange.Net
synced 2025-06-11 01:46:12 +00:00
Made socket more robust, added basic serialization to arrayconverter
This commit is contained in:
parent
47a62d679a
commit
2e49217e20
@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
@ -60,7 +61,19 @@ namespace CryptoExchange.Net.Converters
|
|||||||
|
|
||||||
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
|
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
writer.WriteStartArray();
|
||||||
|
var props = value.GetType().GetProperties();
|
||||||
|
var ordered = props.OrderBy(p => p.GetCustomAttribute<ArrayPropertyAttribute>()?.Index);
|
||||||
|
|
||||||
|
foreach (var prop in ordered)
|
||||||
|
{
|
||||||
|
var converterAttribute = (JsonConverterAttribute)prop.GetCustomAttribute(typeof(JsonConverterAttribute));
|
||||||
|
if(converterAttribute != null)
|
||||||
|
writer.WriteValue(JsonConvert.SerializeObject(prop.GetValue(value), (JsonConverter)Activator.CreateInstance(converterAttribute.ConverterType)));
|
||||||
|
else
|
||||||
|
writer.WriteValue(JsonConvert.SerializeObject(prop.GetValue(value)));
|
||||||
|
}
|
||||||
|
writer.WriteEndArray();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ using System.Threading;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using CryptoExchange.Net.Interfaces;
|
using CryptoExchange.Net.Interfaces;
|
||||||
using CryptoExchange.Net.Logging;
|
using CryptoExchange.Net.Logging;
|
||||||
|
using SuperSocket.ClientEngine;
|
||||||
using SuperSocket.ClientEngine.Proxy;
|
using SuperSocket.ClientEngine.Proxy;
|
||||||
using WebSocket4Net;
|
using WebSocket4Net;
|
||||||
|
|
||||||
@ -97,7 +98,10 @@ namespace CryptoExchange.Net.Implementation
|
|||||||
lock (socketLock)
|
lock (socketLock)
|
||||||
{
|
{
|
||||||
if (socket == null || IsClosed)
|
if (socket == null || IsClosed)
|
||||||
|
{
|
||||||
|
log.Write(LogVerbosity.Debug, "Socket was already closed/disposed");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
log.Write(LogVerbosity.Debug, "Closing websocket");
|
log.Write(LogVerbosity.Debug, "Closing websocket");
|
||||||
ManualResetEvent evnt = new ManualResetEvent(false);
|
ManualResetEvent evnt = new ManualResetEvent(false);
|
||||||
@ -106,11 +110,7 @@ namespace CryptoExchange.Net.Implementation
|
|||||||
socket.Close();
|
socket.Close();
|
||||||
bool triggered = evnt.WaitOne(3000);
|
bool triggered = evnt.WaitOne(3000);
|
||||||
socket.Closed -= handler;
|
socket.Closed -= handler;
|
||||||
|
log.Write(LogVerbosity.Debug, "Websocket closed");
|
||||||
if (!triggered)
|
|
||||||
log.Write(LogVerbosity.Debug, "Websocket closed event did not trigger");
|
|
||||||
else
|
|
||||||
log.Write(LogVerbosity.Debug, "Websocket closed");
|
|
||||||
}
|
}
|
||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
@ -124,24 +124,34 @@ namespace CryptoExchange.Net.Implementation
|
|||||||
{
|
{
|
||||||
return await Task.Run(() =>
|
return await Task.Run(() =>
|
||||||
{
|
{
|
||||||
|
bool connected;
|
||||||
lock (socketLock)
|
lock (socketLock)
|
||||||
{
|
{
|
||||||
log.Write(LogVerbosity.Debug, "Connecting websocket");
|
log.Write(LogVerbosity.Debug, "Connecting 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) => evnt?.Set());
|
||||||
|
var errorHandler = new EventHandler<ErrorEventArgs>((o, a) => evnt?.Set());
|
||||||
socket.Opened += handler;
|
socket.Opened += handler;
|
||||||
socket.Closed += handler;
|
socket.Closed += handler;
|
||||||
|
socket.Error += errorHandler;
|
||||||
socket.Open();
|
socket.Open();
|
||||||
evnt.WaitOne();
|
evnt.WaitOne(TimeSpan.FromSeconds(15));
|
||||||
socket.Opened -= handler;
|
socket.Opened -= handler;
|
||||||
socket.Closed -= handler;
|
socket.Closed -= handler;
|
||||||
var connected = socket.State == WebSocketState.Open;
|
socket.Error -= errorHandler;
|
||||||
|
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);
|
||||||
return connected;
|
evnt.Dispose();
|
||||||
|
evnt = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (socket.State == WebSocketState.Connecting)
|
||||||
|
Close().Wait();
|
||||||
|
|
||||||
|
return connected;
|
||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user