Проектирование класса

119
22 января 2020, 12:30

Стоит задача парсинга биржи криптовалют в n-потоков. Я сделал все на основе паттерна Singleton, чуть изменив его

    var pairs = new List<string>
                {
                    "BTC-LTC",
                    "BTC-DOGE",
                    "BTC-VTC",
                    "BTC-PPC",
                    "BTC-FTC"
                };
for (int i = 0; i < pairs.Count; i++)
{
  var single = Singleton.GetInstance;
  single.Run(pairs[i], "wss://socket.bittrex.com/signalr/connect?transport=webSockets&clientProtocol=1.5&connectionToken=" + token + "");
}

Есть ли более элегантный метод организации данной логики? Основная проблема в том, чтобы параллельно запускать потоки, а не последовательно как щас

public class AskBid
{
    public double price { get; set; }
    public double count { get; set; }
    public string tip { get; set; }
}
public sealed class Singleton
{
    private static volatile Singleton instance;
    private static object sync = new Object();
    public List<Runner> list = new List<Runner>();
    public void Run(string pair, string socketUrl)
    {
        var t = list.Where(x => x.pair == pair);
        if (t.Count() == 0)
        {
            list.Add(new Runner(pair, socketUrl));
        }
    }
    public void Close(string pair)
    {
        var t = list.Where(x => x.pair == pair);
        if (t.Count() != 0)
        {
            t.First().Close();
            list.Remove(t.First());
        }
    }
    public static Singleton GetInstance
    {
        get
        {
            if (instance == null)
            {
                lock (sync)
                {
                    if (instance == null)
                        instance = new Singleton();
                }
            }
            return instance;
        }
    }
    public class Runner
    {
        private WebSocket websocket;
        private List<AskBid> listAskBid = new List<AskBid>();
        public string pair;
        private string socketUrl;

        public Runner(string pair, string socketUrl)
        {
            this.pair = pair;
            this.socketUrl = socketUrl;
            Run();
        }
        public void Run()
        {
            websocket = new WebSocket(socketUrl, "", null, null, "", "",
                WebSocketVersion.None, null, System.Security.Authentication.SslProtocols.Tls12);
            websocket.Opened += (a, b) =>
            {
                Console.WriteLine("Socket opened");
            };
            websocket.Closed += (a, b) => { Console.WriteLine("Socket closed"); };
            websocket.MessageReceived += (a, b) =>
            {
            };
            websocket.Open();
        }

        public void Send(string str)
        {
            websocket.Send(str);
        }
        public void Close()
        {
            websocket.Close();
        }