一.介绍

Task类通常以异步方式执行,Task对象是基于任务的异步模式引入到.NET Framework 4中。

二.任务实例化

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace MyTask
{class Program{static void Main(string[] args){Action<object> action = (object obj) =>{Thread.Sleep(1000);Console.WriteLine("obj:{0}", obj);};Task t1 = new Task(action, "带参数的任务");t1.Start();Console.ReadKey();}}
}

上述实例中任务t1通过调用任务类构造函数实例化,并通过调用Start()方法执行任务;它执行Action<object>名为action的委托,这样它就可以接受object类型的变量。

三.创建和执行任务

Task可能在不同的方式中创建实例,我们最常用的方法就是调用静态Run方法,Run方法提供了简单的方法来启动任务。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace MyTask
{class Program{static void Main(string[] args){Task.Run(() =>{Thread.Sleep(1000);Console.WriteLine("任务执行中。。。");});Console.WriteLine("主线程执行中。。。");Console.ReadKey();}}
}

它可以使用静态方法TaskFactory.StartNew方法来替换;而Task.Factory属性返回TaskFactory对象,重载的TaskFactory.StartNew方法启动任务。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace MyTask
{class Program{static void Main(string[] args){TaskFactory factory = new TaskFactory();Task task1 = factory.StartNew(() =>{Console.WriteLine("任务1执行中。。。");});Task task2 = Task.Factory.StartNew(() =>{Console.WriteLine("任务2执行中。。。");});Console.WriteLine("主线程执行中。。。");Console.ReadKey();}}
}

四.等待一个或多个任务完成

任务通常是以异步方式运行在线程上,创建并启动任务的线程将继续执行,在某些情况下,应用程序需要调用线程继续执行下去,而此时一个或多个任务并没有执行完毕,如果你想要等待这些任务执行完成后,应用程序才能继续执行下去,那么可以通过调用Wait方法来等待一个或多个任务完成。Task.Wait()方法是无条件等待,就是说只要任务不完成,它就会一直阻塞等待。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace MyTask
{class Program{static void Main(string[] args){Console.WriteLine("主程序开始执行。。。");TaskFactory factory = new TaskFactory();Task task = factory.StartNew(() =>{Thread.Sleep(1000);Console.WriteLine("任务执行完成。。。");});task.Wait();Console.WriteLine("主线程执行完成。。。");Console.ReadKey();}}
}

五.WaitAny和WaitAll的使用

在某些情况下,我们只需要等待多个任务中的其中一个,而等待哪个任务并不需要明确指明,那么此时WaitAny就派上用场了;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace MyTask
{class Program{static void Main(string[] args){MyWaitAny();         Console.ReadKey();}private static void MyWaitAny(){var tasks = new Task[3];var rnd = new Random();for (int i = 0; i <= 2; i++){tasks[i] = Task.Run(() => Thread.Sleep(rnd.Next(500, 3000)));}try{//返回值:已完成的任务在 tasks 数组参数中的索引。int index = Task.WaitAny(tasks);Console.WriteLine("Task {0} completed first", tasks[index].Id);Console.WriteLine("Status of all tasks:");foreach (var t in tasks){Console.WriteLine("Task {0}:{1}", t.Id, t.Status);}}catch (Exception e){Console.WriteLine(e.ToString());}}}
}

如果需要等待所有任务完成后,程序才可以继续执行下去,那么WaitAll()无疑是一个比较好的方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace MyTask
{class Program{static void Main(string[] args){          MyWaitAll();Console.ReadKey();}private static void MyWaitAll(){Task[] tasks = new Task[10];for(int i = 0; i < 10; i++){tasks[i] = Task.Run(() => Thread.Sleep(2000));}try{Task.WaitAll(tasks);}catch(Exception e){Console.WriteLine(e.ToString());}Console.WriteLine("Status of Completed tasks:");foreach(var t in tasks){Console.WriteLine("Task {0}:{1}", t.Id, t.Status);}}}
}

想要了解更多关于Task类的相关信息,请访问微软官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.tasks.task?view=netframework-4.5

转载于:https://www.cnblogs.com/QingYiShouJiuRen/p/11238501.html

Task类的简单介绍相关推荐

  1. Android中PackageManager类的简单介绍

    1.PackageManager这个类,表层意思是包管理者,既然可以管理包,那么包下的一些东西便可以获取,其中可以获取应用图标和应用名称以及包名. 通过下面一行代码实例化PackageManager类 ...

  2. java reader_Java之字符输入流,Reader类的简单介绍

    各位小伙伴们大家好,在之前的文章中,小编介绍了Java之文件复制的简单介绍,多是一些关于字节的知识,这次小编要介绍的是字符输入流Reader类,具体如下: java.io.Reader:字符输入流,是 ...

  3. 工具类—MD5简单介绍以及MD5工具类

    2.MD5简单介绍: 1)MD5是什么鬼?: 答:Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛 使用的一种散列函数,用以提供消息的完整性保 ...

  4. Class类的简单介绍

    (虽说转载,但我(linbichengdeps)读完下面文章后个人理解: 1.Class是一个类,且每一个class(类)都有一个Class类,简单的叫法是"class的类". 2 ...

  5. java简单通讯录的实现02person类_Java中Math类的简单介绍

    我想对于Math类大家一定很熟悉了,是Java提供的一个用来进行简单数学运算的工具类.对于Math类来说,常用的方法有: 加法 public static int addExact(int x, in ...

  6. PipedInputStream类 和 PipedOutputStream类 的简单介绍和代码演示

    PipedOutputStream类 和PipedInputStream 类为管道输出流 和管道输入流.通常都是以管道输出流作为管道的起始端,通常管道输出流和管道输入流通过connect方法连接起来, ...

  7. RandomAccessFile类的简单介绍,以及代码演示

    RandomAccessFile类,支持对文件的读取和写入.并且可以设置写入和读取的位置.该位置主要是以字节体现.相当于该文件存储在一个大型byte[] 数组.隐含存在一个指向该数组的指针.类似于该类 ...

  8. ObjectOutputStream 和 ObjectInputStream类的简单介绍,及运用。

    以前在文件中写入数据的主要方式是用字符流或者字节流.但是如果想保存并读取一个对象,该怎么办?可以是用ObjectOutputStream类 和 ObjectInputStream类. ObjecOut ...

  9. FileOutputStream 类 和 FileInputStream类的简单介绍,附代码演示。以及一个复制媒体文件的小程序。

    一.FileOutputStream类. 构造函数:FileOutputStream fos = new FileOutputStream(String fileName);//参数为相关联的文件路径 ...

最新文章

  1. vue-router 去掉#
  2. iOS总结:项目中的各种小坑汇总
  3. python定时关机_python 实现定时关机(windows,python3)
  4. python 获取 字典中的指定键_python中字典方法的详细教程
  5. (69)信号发生器DDS正弦波设计(一)(第14天)
  6. Nginx网站根目录更改及导致403 forbidden的问题解决
  7. sklearn计算准确率,召回率,精确率,F1函数
  8. 3049 舞蹈家怀特先生
  9. FTP搜索引擎开发文档前言部分
  10. 三维空间里点到直线的距离
  11. VirtualBox中不能正常使用OpneGL的问题
  12. Machine Learning-L13-频繁模式挖掘
  13. 对移动社交类产品的追问
  14. 【sv】局部数据存储: 自动存储vs静态存储
  15. 优秀的汽车后市场门店应该具备的数字化能力
  16. EI检索的期刊要怎么区别是否是EI检索
  17. 超级计算机 在线 算命,IBM机器人会算命:100个字看穿你灵魂
  18. C语言的指针符号到底靠近变量类型还是变量名?
  19. jssip answer()问题
  20. HTML5与Flash对比

热门文章

  1. 基于 .Net5.0 的快速开发框架,YuebonCore1.0.3 版已发布
  2. 在Raspberry Pi上轻松设置.NET Core并使用VS Code进行远程调试
  3. 使用Swagger UI的Document和Test API
  4. 递增三元组蓝桥杯c语言,蓝桥-递增三元组-蓝桥
  5. python3怎么使用mnist_loader_Python读取mnist
  6. redistemplate hash 过期时间_redisTemplate的使用以及和stringRedisTemplate的区别
  7. java中两个xml文件内容拼接_比较Java中2个XML文档的最佳方法
  8. Android 添加多个回调,如何在同一个片段中创建多个Retrofit回调 – android
  9. oracle完全卸载重装历程
  10. java性能测试jmh