使用CancellationTokenSource来取消Task
2015-02-25 15:11
399 查看
之前用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);
//});
}
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);
//});
}
相关文章推荐
- 【C#】46. 使用CancellationTokenSource 取消 Task
- C#5.0 采用CancellationTokenSource方式取消Task
- Parallel Programming-使用CancellationTokenSource调度并行运行的Task
- 协作式取消 CancellationTokenSource
- C# 使用 CancellationTokenSource 终止线程
- 线程阶段性总结——APM,ThreadPool,Task,TaskScheduler ,CancellationTokenSource
- .Net 4.5中通过CancellationTokenSource实现对超时任务的取消
- C# 中通过CancellationTokenSource实现对超时任务的取消
- 线程阶段性总结——APM,ThreadPool,Task,TaskScheduler ,CancellationTokenSource
- .Net 4.5中通过CancellationTokenSource实现对超时任务的取消
- C# CancellationTokenSource 终止线程 CancellationTokenSource实现对超时任务的取消
- 使用Visual Studio进行单元测试-Shim类中无法找到参数包含CancellationTokenSource的方法
- 第七节:利用CancellationTokenSource实现任务取消和利用CancellationToken类检测取消异常。
- 关于使用CancellationTokenSource控制子线程结果显示在主线程
- 线程阶段性总结——APM,ThreadPool,Task,TaskScheduler ,CancellationTokenSource
- .Net 4.5中通过CancellationTokenSource实现对超时任务的取消
- C# 中通过CancellationTokenSource实现对超时任务的取消
- 异步与并行~CancellationTokenSource对线程的作用
- 在使用Reference Source调试.Net 源代码时如何取消optimizations(代码优化)