【多线程】 Task

一. 常用方法:

  1. ContinueWith : 当前 Task 完成后, 执行传入的 Task

  2. Delay : 创建一个等待的 Task,只有在调用 Wait 方法时才会阻塞 (注意:与 Thread.Sleep 不同)

  3. Run : 创建一个 Task 并执行

  4. Start : 执行 Task

  5. Wait : 在一定时间内阻塞线程, 直到 Task 完成或超过等待时间时取消阻塞

  6. WaitAll : 阻塞线程直到所有的 Task 完成或超过等待时间

  7. WaitAny : 阻塞线程直到有一个 Task 完成或超过等待时间

二. 常用属性:

  1. Factory : 获取用于创建 Task 的工厂, 创建 Task 用

  2. Status : Task 的状态

三. 语法

   private static void Main(string[] args)
        {
            Console.WriteLine(DateTime.Now+" 开始");
            Task t1 = Task.Factory.StartNew(DoTask).ContinueWith(ContinueTask);// 创建 Task 执行 DoTask, DoTask 完成后 执行ContinueTask
            Task t2 = Task.Factory.StartNew(DoTask);
            Task.WaitAny(new[] { t1, t2 }, 1000);
            Console.WriteLine(DateTime.Now + " WaitAny 超时 1 秒");
            Task.WaitAll(new[] { t1, t2 }, 10 * 1000);
            Console.WriteLine(DateTime.Now + " WaitAll 超时 10 秒");
            t1.Wait(50 * 1000);// 注意 : 这里的 t 指的是 ContinueWith,不是 StartNew, 即表达式最后的 Task
            Console.WriteLine(DateTime.Now + " 等待 t1 超时 50 秒");
            Console.ReadLine();
        }

        private static void DoTask()
        {
            Task.Delay(3 * 1000).Wait();// 阻塞 3 秒, 只有 Wait 后才有效
            Console.WriteLine(DateTime.Now + " DoTask 完成,工作了 3 秒");
        }

        private static void ContinueTask(Task task)
        {
            Task.Delay(4 * 1000).Wait();// 阻塞 4 秒, 只有 Wait 后才有效
            Console.WriteLine(DateTime.Now + " ContinueTask 完成,在 DoTask 之后 工作了 4 秒");
        }

   

时间: 2024-10-10 06:02:44

【多线程】 Task的相关文章

C# 多线程task

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace 多线程Task {     class Program     {         static void Main(string[] args)         {             Task

多线程-Task、await/async

Task创建无返回值 Task是.netframwork3.0重新分装的多线程类.原因以前的多线程(thread threadpool)不好用.(.net framwork也是的发展的,现在的EF,刚开始是一个edmx文件,现在的code first,ef轻量级.但是其他有的技术也是死掉了) Task具有线程执行的可控性,返回值,代码书写简单,性能好等特点. Task创建主要有三种方式 1.Task参数 Task t = new Task(() => { for (int i = 0; i <

多线程--Task,等待用户输入AutoResetEvent

上一篇文章:.NET:如何让线程支持超时?已经说明目前微软主推的多线程方案是task: 注意:Task最好引用.NET4.5. 4.0也行,但不成熟.Thread引用2.0就够了. 1.通过构造函数创建的task,必须手动Start,而通过工厂创建的Task直接就启动了. var task1 = new Task(() => {    }); task.Start(); var task2 = Task.Factory.StartNew(() =>{    }); Task[] tasks =

多线程——Task

背景: 以前想用Semaphore来处理并发访问资源的问题,后来把方案拿给前辈们看的时候,他们说这样也行,但是最好用Task处理,比较简单.所以,顺便学习了下Task. 使用task类创建并执行简单任务 等待任务的完成并获取返回值 使用ContinueWith方法在任务完成时启动一个新任务 创建父子任务和任务工厂的使用 <span style="font-size:12px;">namespace 创建父子任务和任务工厂的使用 { class Program { //通过t

线程——自定义多线程task

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp7 { public class TaskManage { public int maxcount; public int countnum = 0; public TaskMan

.NET(C#):await返回Task的async方法

一.  FrameWork 4.0之前的线程世界    在.NET FrameWork 4.0之前,如果我们使用线程.一般有以下几种方式: 使用System.Threading.Thread 类,调用实例方法Start()开启一个新线程,调用Abort()方法来提前终止线程. 使用System.Threading.ThreadPool类,调用静态方法QueueUserWorkItem(),将方法放入线程池队列,线程池来控制调用. 使用BeginInvoke,EndInvoke,BeginRead

8异步和多线程

1,.NET 中实现异步的方式是使用委托的beginInvoke方法. 使用异步之后.net会创建一个线程来异步执行方法操作,主线程会继续执行程序逻辑.如果在异步执行中有回调函数,在异步方法执行完之后执行异步调用的线程回再执行回调函数中的代码. 1,首先创建一个比较耗时的私有方法用以作为异步执行的代码,后续的多线程执行代码使用的也是该代码. 1 /// <summary> 2 /// 一个比较耗时耗资源的私有方法 3 /// </summary> 4 /// <param n

委托的高级使用

多播委托(multicast)一个委托里面包含了不止一个方法 static void Main(string[] args) { Student stu1 = new Student() { ID=1,PenColor=ConsoleColor.Yellow}; Student stu2 = new Student { ID = 2, PenColor = ConsoleColor.Green }; Student stu3 = new Student { ID = 3, PenColor =

多线程系列(3)任务Task

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

多线程随笔二(Task)

Task类是.net 4.0新加进来的特性,对原有的Thread,ThreadPool做了进一步的封装,使得.net平台上的多线程编程变得更加方便.废话不多说,进入正题. 一. Task启动 Task启动主要有以下几种用法: 1.构造Task对象,启动Task 1 Task myTask = new Task(DoSomething); 2 myTask.Start(); 2.通过Task.Factory启动Task Task second = Task.Factory.StartNew(DoS