public StockScannerAgent(List <string> stockList, NetworkDataReader reader, SqlDataReader sqlReader)
        {
            StockList  = stockList;
            _reader    = reader;
            _sqlReader = sqlReader;
            _source    = new CancellationTokenSource();
            var token = _source.Token;

            Scanner = new Task(() =>
            {
                int i = 0;
                while (i < _initialSleep)
                {
                    i++;
                    System.Threading.Thread.Sleep(1000);
                    Console.WriteLine("Currently sleep, give resource to other threads, " + i + " seconds left");
                }
                Console.WriteLine("The current List contains " + stockList.Count + " stocks");
                i = 0;
                while (true)
                {
                    if (stockList.Count <= 0)
                    {
                        break;
                    }
                    if (token.IsCancellationRequested)
                    {
                        token.ThrowIfCancellationRequested();
                    }
                    int status = 1; //sqlReader.IsStockAnalysedRecently(stockList[i]);

                    switch (status)
                    {
                    case 0:     // database has no record, need to insert
                        {
                            StockSummary tmp = _reader.FetchStockTrendSummaryObject(stockList[i]);
                            GeneralTools.AnalyseStockTrend(ref tmp);
                            GeneralTools.AnalyseStockTrendLine(ref tmp);
                            _sqlReader.UpdateStockAnalysis(tmp, 0);
                            Console.WriteLine("Stock " + stockList[i] + " inserted!");
                            break;
                        }

                    case 1:     // database needs to update
                        {
                            StockSummary tmp = _reader.FetchStockTrendSummaryObject(stockList[i]);
                            GeneralTools.AnalyseStockTrend(ref tmp);
                            GeneralTools.AnalyseStockTrendLine(ref tmp);
                            _sqlReader.UpdateStockAnalysis(tmp, 1);
                            Console.WriteLine("Stock " + stockList[i] + " updated!");
                            break;
                        }

                    case 2:
                        {
                            Console.WriteLine("Stock " + stockList[i] + " up to date!");
                            break;
                        }

                    default:
                        break;
                    }
                    Console.WriteLine("current scanned stock: " + stockList[i]);
                    i++;
                    if (i == stockList.Count)
                    {
                        i = 0;
                    }
                    System.Threading.Thread.Sleep(_scanInterval * 1000);
                }
            }, _source.Token);
            Start();
        }