|
|
<div id="cnblogs_post_body">最近刚装上了vs2012,发现新增加Task任务,很不错,应该是Thread有一定的优势,特别是UI相关的多线程方面,可以很方便实现,不让界面死锁掉。
但在中断时遇到问题:
为什么取消的Task实际偷偷的还在继续运行呢?
首先如何中断,我们会使用到CancellationTokenSource这个,很容易做到。
<div class="cnblogs_code"> 1 static void Main(string[] args) 2 { 3 try 4 { 5 Run(); 6 } 7 catch (OperationCanceledException) 8 { 9 Console.WriteLine("OperationCanceledException:操作取消了.");10 }11 12 13 Thread.Sleep(1000 * 300);//等待结束。14 }15 16 17 18 19 static async void Run()20 {21 Console.WriteLine("Run2开始.");22 //主要的任务23 Task tw = new Task(() =>24 {25 26 //这是可以中断或取消任务的27 CancellationTokenSource tokenSource = new CancellationTokenSource();28 var token = tokenSource.Token;29 30 31 //这个是实际想完成的任务32 Task t1 = Task.Factory.StartNew(() =>33 {34 //异步执行35 Task.Factory.StartNew(() =>36 {37 TaskTest1();38 });39 40 41 while (true)42 {43 //检测到取消了44 if (token.IsCancellationRequested)45 {46 Console.WriteLine("强制取消了");47 token.ThrowIfCancellationRequested();//强制取消 并不会让TaskTest1停止执行48 }49 Thread.Sleep(10);50 }51 52 53 54 }, token);55 56 if (!t1.Wait(1000 * 5, tokenSource.Token))//这里设置了一个超时的时间秒数57 {58 tokenSource.Cancel();//取消任务59 Console.WriteLine("超时,取消任务");60 }61 62 63 });64 tw.Start();//任务开始了65 await tw;//用这个,不会阻塞界面66 Console.WriteLine("Run2结束.");67 }68 69 static void TaskTest1()70 {71 Console.WriteLine("TaskTest1 开始.");72 Thread.Sleep(1000 * 20);73 Console.WriteLine("TaskTest1 完成.");74 } |
|