var source =new CancellationTokenSource();
var token = source.Token;
var task = Task.Factory.StartNew(() =>
{
Console.WriteLine("Task starting...");
while (true)
{
token.ThrowIfCancellationRequested();
Console.WriteLine("I'm alive. {0}",DateTime.Now);
Thread.Sleep(1000);
}
},token);
在c#并行处理中。在实际项目中。不可能使用while(true)这种方式进行循环验证。。如果只是一个方法执行下去。请问怎样取消掉该任务???
研究了下貌似没什么好办法,提供两个参考
1、可能在耗时任务中“常常”if (curToken.IsCancellationRequested){}这样判断是个好习惯。
2、使用token.Regester()+Abort()终止线程,这个好像很偏,后遗症也不知道,代码如下
var source = new CancellationTokenSource(); var token = source.Token; var task = Task.Factory.StartNew((objToken) => { CancellationToken curToken = (CancellationToken)objToken; curToken.Register((objThread) => { Thread curThread = objThread as Thread; Console.WriteLine(String.Format("线程ID为{0},Task终止", curThread.ManagedThreadId)); curThread.Abort(); } , Thread.CurrentThread); Console.WriteLine("Task starting..."); while (true) { Console.WriteLine(String.Format("线程ID为{0},I'm alive. {1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now)); Thread.Sleep(1000); } }, token); Thread.Sleep(5000); try { source.Cancel(); } catch { // 使用curThread.Abort();这里捕获不到异常System.Threading.ThreadAbortException }
结果图:
while(flag){
//
}
外部改变flag值为false后,循环就结束了。