コード例 #1
0
        private async Task <List <MarketSummary> > GetExtendedMarketSummaries(string quoteCurrency)
        {
            var summaries = new List <MarketSummary>();

            var symbolsCacheKey = this._exchange + "Markets";
            var symbols         = await Global.AppCache.GetAsync <IEnumerable <ExchangeMarket> >(symbolsCacheKey);

            if (symbols == null || !symbols.Any())
            {
                symbols = await _api.GetMarketSymbolsMetadataAsync();

                Global.AppCache.Add(symbolsCacheKey, symbols, new MemoryCacheEntryOptions
                {
                    AbsoluteExpiration = DateTimeOffset.Now.AddHours(1),
                });
            }

            if (symbols.Count() == 0)
            {
                throw new Exception();
            }

            var list = await _api.GetMarketSymbolsAsync();

            var filteredList = list.Where(x => x.ToLower().EndsWith(quoteCurrency.ToLower(), StringComparison.Ordinal));

            //var tasks = new Task[summaries.Count()];
            //var cts = new CancellationTokenSource();
            //var po = new ParallelOptions
            //{
            //    CancellationToken = cts.Token,
            //    MaxDegreeOfParallelism = Environment.ProcessorCount
            //};
            //Parallel.ForEach(filteredList, po, (item, state, index) =>
            //{
            //    tasks[(int)index] = Task.Run(() =>
            //    {
            //        var ticker = _api.GetTickerAsync(item).Result;

            //        if (ticker != null)
            //        {
            //            var symbol = symbols.FirstOrDefault(x => x.MarketName == item);

            //            if (symbol != null)
            //            {
            //                summaries.Add(new MarketSummary()
            //                {
            //                    CurrencyPair = new CurrencyPair() { BaseCurrency = symbol.MarketCurrency, QuoteCurrency = symbol.BaseCurrency },
            //                    MarketName = item,
            //                    Ask = ticker.Ask,
            //                    Bid = ticker.Bid,
            //                    Last = ticker.Last,
            //                    Volume = ticker.Volume.ConvertedVolume,
            //                });
            //            }
            //        }
            //    });
            //});
            //Task.WaitAll(tasks);

            foreach (var item in filteredList)
            {
                var ticker = await _api.GetTickerAsync(item);

                if (ticker != null)
                {
                    var symbol = symbols.FirstOrDefault(x => x.MarketSymbol == item);

                    if (symbol != null)
                    {
                        summaries.Add(new MarketSummary()
                        {
                            CurrencyPair = new CurrencyPair()
                            {
                                BaseCurrency = symbol.QuoteCurrency, QuoteCurrency = symbol.BaseCurrency
                            },
                            MarketName = item,
                            Ask        = ticker.Ask,
                            Bid        = ticker.Bid,
                            Last       = ticker.Last,
                            Volume     = ticker.Volume.QuoteCurrencyVolume,
                        });
                    }
                }
            }

            return(summaries);
        }