需要在.Net 4.0才会有Task
当然,既然接触到了Task,或许以后就不再用线程了,具体看情况了,之前几个线程之间就发生了阻塞问题,这次就是要解决这个问题才下这个功夫的,否则宁可被差遣抱儿子尿尿去。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace TaskDemo { class Program { static void Main(string[] args) { Thread mTH = new Thread(RunTask); mTH.Start(); //Thread mTH1 = new Thread(RunThread); //mTH1.Start(); } private static void RunThread() { for (int i = 0; i < 20; i++) { Thread.Sleep(2); Console.WriteLine("RunThread{0}", i); } } private static void RunTask() { try { int mCount = 0; CancellationTokenSource tokenSource = new CancellationTokenSource(); CancellationToken token = tokenSource.Token; Task t = new Task(() => { Console.WriteLine("进入任务……"); Thread.Sleep(10); Console.WriteLine("任务开始工作……"); //模拟工作过程 for (int i = 0; i < 20; i++) { if (token.IsCancellationRequested == true) { break; //这里别人是用一个throw new OperationCanceledException(token); 但是我用就会报错 } mCount++; Console.WriteLine("RunTask{0}", i); Thread.Sleep(1); } }, token); token.Register(() => { Console.WriteLine("Canceled"); }); t.Start(); Console.WriteLine("这条语句先运行完毕了……"); t.ContinueWith((task) => { Console.WriteLine("任务完成,完成时候的状态为:"); Console.WriteLine("IsCanceled={0}\tIsCompleted={1}\tIsFaulted={2}\tmCount={3}", task.IsCanceled, task.IsCompleted, task.IsFaulted, mCount); }); Console.WriteLine("现在就按任意键的话,程序就退出了……"); RunThread(); //线程内部较耗时的测试 Console.ReadKey(); //由于两个sleep都有点时间,如果在这时间之前按下任意键,结果是程序提前终止了 tokenSource.Cancel(); Console.ReadKey(); //程序退出 } catch (Exception Ex) { Console.WriteLine(Ex.Message); } } } }
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。