Пример #1
0
        /// <summary>
        /// Starts a scan using the given trade provider.
        /// </summary>
        /// <param name="currencies">currencies to scan for.</param>
        /// <param name="tradeProvider">provider</param>
        public async Task StartScan()
        {
            if (IsRunning)
            {
                return;
            }

            IsRunning = true;
            _logger.Info($"Initializing for League: {League}\n" +
                         $"Provider: {_tradeProvider.ProviderName()}({_tradeProvider.ProviderUrl()}).\n" +
                         $"Scan Cycle: {_scanCycleTime}. Result Limit: {_resultLimit}");
            _provider = _tradeProvider;
            _logger.Info("Starting Scan");


            InitializeScannerQueue(_currencies);
            // scan while we haven't called stop and we still have scanners to process.
            while (IsRunning && _scanQueue.Count > 0)
            {
                _logger.Info("Getting Scanner");
                var scanner = _scanQueue.Dequeue();

                if (OfferData.ContainsKey(scanner.BuyingType))
                {
                    _logger.Info($"Clearing offer data stored for {scanner.BuyingType}");
                    OfferData[scanner.BuyingType].Clear();
                }

                _logger.Info($"Getting Buy Offers for {scanner}");

                await Task.Run(async() => await CompileOfferData(scanner, _currencies));

                // exit so we don't wait on the last iteration
                if (_scanQueue.Count <= 0)
                {
                    continue;
                }

                _logger.Info($"Waiting {_scanCycleTime} to run next scanner.");
                await Task.Delay(_scanCycleTime);
            }

            _logger.Info("Completed scan.");
            Finished?.Invoke(this, EventArgs.Empty);
            IsRunning = false;
        }