六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 322|回复: 0

C#中用Task,中断任务可能遇到的问题!

[复制链接]

升级  80%

10

主题

10

主题

10

主题

童生

Rank: 1

积分
40
 楼主| 发表于 2013-1-2 23:00:44 | 显示全部楼层 |阅读模式
<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         }
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表