使用CancellationTokenSource来取消Task

 之前用quartz的调度进度的由于无法精确到间隔毫秒级,自己写了个任务来实现这个用来抓取股票行情和期货行情数据,永远是stock populate 很多,option populate很慢,那就写两个task来实现吧,但是却无法像cronmarker来设定某分某秒来跑,用windows的任务呢又不方便,因为这个是做成服务放在quartz的那个类一起的,所以。。。,下面贴代码:
  public void Start()
        {


             DateTime G_DateTime;
           
             Thread P_th = new Thread(
                 () =>
                 {
                         CancellationTokenSource ctsOption = new CancellationTokenSource(); 
                             CancellationTokenSource ctsStock = new CancellationTokenSource();
                     while (true)
                     {
                         G_DateTime = DateTime.Now;
                         TimeSpan P_TimeSpan = G_DateTime - DateTime.Today;
                         if (P_TimeSpan.TotalHours >= 9 && P_TimeSpan.TotalHours <= 16)
                         {
                             Logger.Debug("system's current Date & Time:" + P_TimeSpan.Hours + ":" + P_TimeSpan.Minutes + ":" + P_TimeSpan.Seconds);
                             ThreadPopulateOptionsQuotes(ctsOption.Token);
                             ThreadPopulateStockQuotes(ctsStock.Token);
                            
                             if (tPopulateOptionsQuotes.Status == TaskStatus.Created)
                             {
                                 tPopulateOptionsQuotes.Start();
                                 tPopulateStockQuotes.Start();
                             }
                         }
                         else
                         {
                             ctsOption.Cancel();
                             ctsStock.Cancel();
                         }
                         Thread.Sleep(60000);
                     }
                 });


             P_th.IsBackground = true;
             P_th.Start();
            
           
        }




        public void ThreadPopulateOptionsQuotes(CancellationToken token)
        {


            tPopulateOptionsQuotes = new Task(() =>
            {
                Logger.Debug("PopulateRealTimeOptionsQuotes Start……");


                while (true)
                {
                    if (!token.IsCancellationRequested)
                    {
                        Stopwatch stopwatch = new Stopwatch();
                        stopwatch.Start();
                        _marketDataPopulatorService.PopulateRealtimeOptionsQuotes();
                        stopwatch.Stop();
                        Logger.Info("PopulateRealTimeOptionsQuotes cost: " + stopwatch.ElapsedMilliseconds + " ms");
                        //Thread.Sleep(200);
                    }
                    else { Logger.Info("Manipulation regarding Populate Options Quotes has been cancelled "); }
                }


            });
          
            //tPopulateOptionsQuotes.ContinueWith((task) =>
            //{
            //    Logger.Debug("PopulateRealTimeQuotes Complete……");
            //    Logger.Debug("IsCanceled=" + task.IsCanceled + "IsCompleted=" + task.IsCompleted + "IsFaulted" + task.IsFaulted);


            //});


          


        }


        public void ThreadPopulateStockQuotes(CancellationToken token)
        {
             tPopulateStockQuotes = new Task(() =>
            {
                Logger.Debug("PopulateRealTimeStocksQuotes Start……");


                while (true)
                {
                    if (!token.IsCancellationRequested)
                    {
                        Stopwatch stopwatch = new Stopwatch();
                        stopwatch.Start();
                        _marketDataPopulatorService.PopulateRealtimeStocksQuotes();
                        stopwatch.Stop();
                        Logger.Info("PopulateRealTimeStocksQuotes:" + stopwatch.ElapsedMilliseconds);
                        //Thread.Sleep(200);
                    }
                    else { Logger.Info("Manipulation regarding Populate Stock Quotes has been cancelled "); }
                }


            });
            
            //tPopulateStockQuotes.ContinueWith((task) =>
            //{


            //    Logger.Debug("PopulateRealTimeStocksQuotes Complete……");
            //    Logger.Debug("IsCanceled=" + task.IsCanceled + "IsCompleted=" + task.IsCompleted + "IsFaulted" + task.IsFaulted);
            //});
        }

你可能感兴趣的:(使用CancellationTokenSource来取消Task)