任务取消TASK

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication15
{
    class Program
    {
        static void Main(string[] args)
        {

            var cts = new CancellationTokenSource();
            var ct = cts.Token;

            Task task1 = new Task(() => { Run1(ct); }, ct);

            Task task2 = new Task(Run2);

            task1.Start();
            task2.Start();

            Task.Factory.StartNew(() =>
            {
                Thread.Sleep(15 * 1000);
                cts.Cancel();
                try
                {

                    task1.Wait();
                    task2.Wait();
                }
                catch (AggregateException ex)
                {
                    foreach (var e in ex.InnerExceptions)
                    {
                        Console.WriteLine("\nhi,我是OperationCanceledException:{0}\n", e.Message);
                    }

                    Console.WriteLine("task1是不是被取消了? {0}", task1.IsCanceled);
                    Console.WriteLine("task2是不是被取消了? {0}", task2.IsCanceled);
                }

            });

        Console.ReadLine();

        }
    static void Run1(CancellationToken ct)
    {

        Console.WriteLine("我是任务1");

        while (true)
        {
            ct.ThrowIfCancellationRequested();
            Thread.Sleep(1000);
            ct.ThrowIfCancellationRequested();
            Thread.Sleep(1000);
            ct.ThrowIfCancellationRequested();
            Thread.Sleep(1000);
            ct.ThrowIfCancellationRequested();
            Thread.Sleep(1000);
            ct.ThrowIfCancellationRequested();
            Thread.Sleep(2000);

        }
        ct.ThrowIfCancellationRequested();
        Console.WriteLine("我是任务1的第二部分信息");
    }

    static void Run2()
    {

        Console.WriteLine("我是任务2");
    }
}
}
时间: 2024-12-17 17:57:29

任务取消TASK的相关文章

多线程系列(3)任务Task

虽然使用线程池ThreadPool让我们使用多线程变得容易,但是因为是由系统来分配的,如果想对线程做精细的控制就不太容易了,比如某个线程结束后执行一个回调方法.恰好Task可以实现这样的需求.这篇文章我从以下几点对Task进行总结. 认识Task Task的用法 认识Task Task类在命名空间System.Threading.Tasks下,通过Task的Factory返回TaskFactory类,以TaskFactory.StartNew(Action)方法可以创建一个新的异步线程,所创建的

Task.WaitAll代替WaitHandle.WaitAll

Task.Waitall阻塞了当前线程直到全完.whenall开启个新监控线程去判读括号里的所有线程执行情况并立即返回,等都完成了就退出监控线程并返回监控数据. task.Result会等待异步方法返回,当然阻塞住了.别和await 同时用. Task和ThreadPool的功能类似,可以用来创建一些轻量级的并行任务.对于将一个任务放进线程池    ThreadPool.QueueUserWorkItem(A); 这段代码用Task来实现的话,方式如下:    Task.Factory.Star

【转】【C#】【Thread】【Task】多线程

多线程 多线程在4.0中被简化了很多,仅仅只需要用到System.Threading.Tasks.::.Task类,下面就来详细介绍下Task类的使用. 一.简单使用 开启一个线程,执行循环方法,返回结果.开始线程为Start(),等待线程结束为Wait(). /// <summary> /// Task简单使用 /// </summary> private void Demo1() { int i = 0; Random r = new Random(DateTime.Now.S

C# Task 用法

转自原文 C# Task 用法 C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下,配合CancellationTokenSource类更为可以轻松的对Task操作的代码进行中途终止运行,会在后面的章节中讲述. 如果我们使用线程池来实现某几个方法运行,然后等待运行完成的大概会编写如下代码: using (ManualResetEvent m1 = n

TPL Part 1 Task 的使用

创建Task //1. 使用Action Task task1 = new Task(newAction(printMessage)); // 使用匿名代理 Task task2 = new Task(delegate { printMessage(); }); // 使用Lambda Task task3 = new Task(() =>printMessage()); // 使用匿名代理 Task task4 = new Task(() => { printMessage(); }); 还

C#线程篇---Task(任务)和线程池不得不说的秘密(5)

在上篇最后一个例子之后,我们发现了怎么去使用线程池,调用ThreadPool的QueueUserWorkItem方法来发起一次异步的.计算限制的操作,例子很简单,不是吗? 然而,在今天这篇博客中,我们要知道的是,QueueUserWorkItem这个技术存在许多限制.其中最大的问题是没有一个内建的机制让你知道操作在什么时候完成,也没有一个机制在操作完成是获得一个返回值,这些问题使得我们都不敢启用这个技术. Microsoft为了克服这些限制(同时解决其他一些问题),引入了任务(tasks)的概念

菜鸟之旅——学习线程(Task)

菜鸟之旅--学习线程(Task) 前面两篇回顾线程和线程池的使用方法,微软在.NET4.5推出了新的线程模型-Task.本篇将简单的介绍Task的使用方法. Task与线程 Task与线程或者说线程池关系紧密,可以说是基于线程池实现的,虽说任务最终还是要抛给线程去执行,但是Task仍然会比线程.线程池的开销要小,并且提供了可靠的API来控制线任务执行. 使用Task来执行的任务最终会交给线程池来执行,若该任务需要长时间执行,可以将其标记为LongRunning,这是便会单独去请求创建线程来执行该

C#线程篇---Task(任务)和线程池不得不说的秘密

我们要知道的是,QueueUserWorkItem这个技术存在许多限制.其中最大的问题是没有一个内建的机制让你知道操作在什么时候完成,也没有一个机制在操作完成是获得一个返回值,这些问题使得我们都不敢启用这个技术. Microsoft为了克服这些限制(同时解决其他一些问题),引入了任务(tasks)的概念.顺带说一下我们得通过System.Threading.Tasks命名空间来使用它们. 现在我要说的是,用线程池不是调用ThreadPool的QueueUserWorkItem方法,而是用任务来做

Java阻塞中断和LockSupport

在介绍之前,先抛几个问题. Thread.interrupt()方法和InterruptedException异常的关系?是由interrupt触发产生了InterruptedException异常? Thread.interrupt()会中断线程什么状态的工作? RUNNING or BLOCKING? 一般Thread编程需要关注interrupt中断不?一般怎么处理?可以用来做什么? LockSupport.park()和unpark(),与object.wait()和notify()的区