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(); }