.NET 4并行(多核)编程系列之四 Task的休眠

前言:之前的几篇文章断断续续的介绍了Task的一些功能:创建,取消。本篇介绍Task的休眠,本篇的内容比较的少。

本篇的议题如下:

1.Task的休眠。

1.Task的休眠

有时候,我们常常希望一个Task在等待一段时间之后再运行,也就有点类似之前多线程编程中的Sleep。我们可以设置一个Task休眠多长时间,当这个时间过了,Task就自动的唤醒接着运行。

下面就讲讲休眠的方法:

a.使用CancellationToken的Wait Handle:

a)在.NET 4并行编程中,让一个Task休眠的最好的方式就是使用CancellationToken的等待操作(Wait Handle)。而且操作起来也很简单:首先创建一个CancellationTokenSource的实例,然后通过这个实例的Token属性得到一个CancellationToken的实例,然后在用CancellationToken的WaitHandle属性,然后调用这个这个属性的WaitOne()方法。其实在之前讲述”Task的取消”一文中就已经使用过。

b)WaitOne()方法有很多的重载方法来提供更多的功能,例如可以传入一个int的整数,表明要休眠多长的时间,单位是微秒,也可以传入一个TimeSpan的值。如果调用了CancellationToken的Cancel()方法,那么休眠就立刻结束。就是因为这个原因,我们之前的文章讲过,WaitOne()可以作为检测Task是否被取消的一个方案

下面来看一段示例代码:

代码

static void Main(string[] args)
         {
             // create the cancellation token source
             CancellationTokenSource tokenSource = new CancellationTokenSource();
             // create the cancellation token
             CancellationToken token = tokenSource.Token;
             // create the first task, which we will let run fully
             Task task1 = new Task(()=>
             {
                 for (int i = 0; i < Int32.MaxValue; i++)
                 {
                     // put the task to sleep for 10 seconds
                     bool cancelled = token.WaitHandle.WaitOne(10000);
                     // print out a message
                     Console.WriteLine("Task 1 - Int value {0}.Cancelled? {1}",
                     i, cancelled);
                     // check to see if we have been cancelled
                     if (cancelled)
                     {
                         throw new OperationCanceledException(token);
                     }
                 }
             }, token);
             // start task
             task1.Start();
             // wait for input before exiting
             Console.WriteLine("Press enter to cancel token.");
             Console.ReadLine();
             // cancel the token
             tokenSource.Cancel();
             // wait for input before exiting
             Console.WriteLine("Main method complete.Press enter to finish.");
             Console.ReadLine();
         }

时间: 2024-11-20 12:48:37

.NET 4并行(多核)编程系列之四 Task的休眠的相关文章

.NET 4 并行(多核)编程系列之四 Task的休眠

原文:.NET 4 并行(多核)编程系列之四 Task的休眠 .NET 4 并行(多核)编程系列之四 Task的休眠 前言:之前的几篇文章断断续续的介绍了Task的一些功能:创建,取消.本篇介绍Task的休眠,本篇的内容比较的少. 本篇的议题如下: 1.       Task的休眠.   系列文章链接: .NET 4 并行(多核)编程系列之一入门介绍 .NET 4 并行(多核)编程系列之二 从Task开始  .NET 4 并行(多核)编程系列之三 从Task的取消  .NET 4 并行(多核)编

.NET 并行(多核)编程系列之五 Task执行和异常处理

原文:.NET 并行(多核)编程系列之五 Task执行和异常处理 .NET 并行(多核)编程系列之五 Task执行和异常处理 前言:本篇主要讲述等待task执行完成. 本篇的议题如下: 1. 等待Task执行完成 2. Task中的异常处理   系列文章链接: .NET 4 并行(多核)编程系列之一入门介绍 .NET 4 并行(多核)编程系列之二 从Task开始  .NET 4 并行(多核)编程系列之三 从Task的取消  .NET 4 并行(多核)编程系列之四 Task的休眠  .NET 并行

.NET并行(多核)编程系列之五 Task执行和异常处理

前言:本篇主要讲述等待task执行完成. 本篇的议题如下: 1. 等待Task执行完成 2. Task中的异常处理 首先注意一点:这里提到的"等待"和之前文章提到的"休眠"意思是不一样的: 等待:在等待一个task的时候,这个task还是在运行之中的,"等待"相当于在监听运行的task的执行情况. 休眠:让tasku不运行. 在上篇文章中介绍了如果从Task中获取执行后的结果:在Task执行完成之后调用Task.Result获取.其实也可以用其他

.NET并行(多核)编程系列之六 Task基础部分完结篇

前言:之前的文章介绍了了并行编程的一些基本的,也注重的讲述了Task的一些使用方法,本篇很短,将会结束Task的基础知识的介绍. 本篇的主要议题如下: 1. 获取Task的状态 2. 执行晚加载的Task(Lazily Task) 3. 常见问题的解决方案 1.获取Task的状态 在.NET并行编程还有一个已经标准化的操作就是可以获取task的状态,通过Task.Status属性来得到的,这个属性返回一个System.Threading.Tasks.TaskStatus的枚举值. 如下: Cre

.NET并行(多核)编程系列之七 共享数据问题和解决概述

前言:之前的文章介绍了了并行编程的一些基础的知识,从本篇开始,将会讲述并行编程中实际遇到一些问题,接下来的几篇将会讲述数据共享问题. 本篇的议题如下: 数据竞争 解决方案提出 顺序的执行解决方案 数据不变解决方案 在开始之前,首先,我们来看一个很有趣的例子: class BankAccount{ public int Balance { get; set; }}class App{ static void Main(string[] args) { // create the bank acco

一起谈.NET技术,.NET并行(多核)编程系列之七 共享数据问题和解决概述

之前的文章介绍了了并行编程的一些基础的知识,从本篇开始,将会讲述并行编程中实际遇到一些问题,接下来的几篇将会讲述数据共享问题. 本篇的议题如下: 1.数据竞争 2.解决方案提出 3.顺序的执行解决方案 4.数据不变解决方案 在开始之前,首先,我们来看一个很有趣的例子: class BankAccount { public int Balance { get; set; } } class App { static void Main(string[] args) { // create the

Java并发编程系列之四:volatile和锁的内存语义

前言 在前面的文章中已经提到过volatile关键字的底层实现原理:处理器的LOCK指令会使得其他处理器将缓存刷新到内存中(确切说是主存)以及会把其他处理器的缓存设置为无效.这里的内存语义则说的是在JMM中的实现,那么为什么要理解volatile和锁在JMM中的内存语义呢?主要原因是这部分内容是与程序开发息息相关的,所以在高并发量的系统中,如果对这块知识的了解欠缺的话将无法设计出优雅支持高并发的系统(之前广被吐槽的12306,现在勉强能够支持千万级别的访问量了). volatile的内存语义 简

.NET 4 并行(多核)编程系列之二 从Task开始

原文:.NET 4 并行(多核)编程系列之二 从Task开始 .NET 4 并行(多核)编程系列之二 从Task开始          前言:我们一步步的从简单的开始讲述,还是沿用我一直的方式:慢慢演化,步步为营.     本篇文章的议题如下:    1.Task基础介绍    2.Task的创建     3.获取Task的执行结果 4. 补充细节   系列文章链接: .NET 4 并行(多核)编程系列之一入门介绍 .NET 4 并行(多核)编程系列之二 从Task开始  .NET 4 并行(多

.NET 4 并行(多核)编程系列之一入门介绍

本系列文章将会对.NET 4中的并行编程技术(也称之为多核编程技术)以及应用作全面的介绍. 本篇文章的议题如下: 1. 并行编程和多线程编程的区别. 2. 并行编程技术的利弊 3. 何时采用并行编程 1.并行编程和多线程编程的区别. 1.1并行编程. 现在随着多核计算机的普及,并行编程技术,也就是多核编程技术也逐渐称为开发的主流.为此,在.NET 4 中就引入了"并行编程".在.NET 4 中一些列的Library和类为并行编程提供了支持,如: Task Parallel Librar