CancellToken方式:
static void Main(string[] args) { var cancell = new CancellationTokenSource(); var token = cancell.Token; var task = new Task(() => { for (var i = 0; i < 100000; i++) { var cancelled = token.WaitHandle.WaitOne(10000); Console.WriteLine(" {0}. Cancelled? {1}", i, cancelled); if (cancelled) { throw new OperationCanceledException(token); } } }, token); task.Start(); Console.WriteLine("Press enter to cancel token."); Console.ReadLine(); cancell.Cancel(); Console.WriteLine("Main method complete. Press enter to finish."); Console.ReadLine(); }
每次我们等待十秒钟之后,在进行下次输出。
上面的功能如果我们要是通过Tread.Sleep方式实现:
var task = new Task(() => { for (var i = 0; i < 100000; i++) { Thread.Sleep(10000); var cancelled = token.IsCancellationRequested; Console.WriteLine(" {0}. Cancelled? {1}", i, cancelled); if (cancelled) { throw new OperationCanceledException(token); } } }, token);
Thread.SpainWait则跟上面的种方式完全不同,上面的两种方式都是会在线程调度程序不考虑改线程,直等到运行结束。而Thread.SpainWait的作用实质上会将处理器置于十分紧密的循环中,主要的作用是来实现同步锁的作用。并不常用,大部分情况下我们可以通过Lock的方式来实现。
等待任务执行
在很多时候我们也许需要等待同时开启的几个线程完成之后再来做其他事,在TPL中提供了几种方式来等待任务执行。Task.Wait等待单个任务完成;Task.WaitAll等待所有的Task完成、TaskAny等在其中的任何一个或则多个任务完成。
Task.Wait:
Task.Wait共有5个重载:Wait()、Wait(CancellToken)、Wait(Int32)、Wait(TimeSpan)、Wait(TimeSpan、CancellToken)。各个重载方法的含义:
1)Wait():等待整个任务完成或则取消或则出现异常;
2)Wait(CancellToken):等待任务直到CancellToken调用取消或则完成,或则出现异常;
3)Wait(Int32):等待任务,未完成则到指定的时间;
4)Wait(TimeSpan):同上;
5)Wait(TimeSpan、CancellToken):等待任务到指定时间,或则CancellToken调用取消或则任务完成。
看个示例:
static void Main(string[] args) { var tokenSource = new CancellationTokenSource(); CancellationToken token = tokenSource.Token; Task task = createTask(token,6); task.Start(); Console.WriteLine("Wait() complete."); task.Wait(); Console.WriteLine("Task Completed."); task = createTask(token,3); task.Start(); Console.WriteLine("Wait(2) secs for task to complete."); bool completed = task.Wait(2000); Console.WriteLine("Wait ended - task completed: {0}", completed); task = createTask(token,4); task.Start(); Console.WriteLine("Wait(2,token) for task to complete."); completed = task.Wait(2000, token); Console.WriteLine("Wait ended - task completed: {0} task cancelled {1}", completed, task.IsCanceled); Console.WriteLine("Main method complete. Press enter to finish."); Console.ReadLine(); } static Task createTask(CancellationToken token,int loop) { return new Task(() => { for (int i = 0; i < loop; i++) { token.ThrowIfCancellationRequested(); Console.WriteLine("Task - Int value {0}", i); token.WaitHandle.WaitOne(1000); } }, token); }
循环都会等待1秒钟,这样我们可以看看Wait(2000)的效果,看看运行后的效果:
Task.WaitAll
WaitAll方法是等待所有的任务完成,也有5个重载,我们来看示例:
static void Main(string[] args) { var tokenSource = new CancellationTokenSource(); CancellationToken token = tokenSource.Token; var task1 = createTask(token,2); var task2 = createTask(token, 5); task1.Start(); task2.Start(); Console.WriteLine("Waiting for tasks to complete."); Task.WaitAll(task1, task2); Console.WriteLine(
补充:Web开发 , ASP.Net ,
- 更多asp疑问解答:
- asp正则过滤重复字符串的代码
- 用asp过滤全部html但保留br类似的符号
- 会asp,但感觉asp要过点,想学php。但我一般做的都是小公司的站,用access数
- PHP的空间可以用ASP的源代码吗?
- 以前做asp程序,现在应该怎样发展?是学.net还是php
- 以前做asp程序,现在应该怎样发展?是学.net还是php
- 想做一个市级的人才网acess,sql数据库,语言asp,jsp,php分别用哪种好
- jsp,asp,php 区别
- 我想找一个有比较多漏洞的网站的源码,比如可以asp,php注入等都可以。供学习研究用。请提供下载地址。。
- 现在候找人做个网站,用ASP,还是PHP语言去做好
- asp,php ,jsp,.net 对于做网站前台的重要吗?
- asp和php的区别是什么?
- 我是新手SEO菜鸟 请问wp dw php asp cms myspl dede 这些软件应该如何区分呀?
- 网页制作相关的三种语言:ASP JSP PHP那个好点,简单点?
- 网页制作相关的三种语言:ASP JSP PHP那个好点,简单点?