并行编程和任务(二)
目录
前言
上一篇我们主要介绍了并行编程相关的知识,这一节我们继续介绍关于任务相关的知识。为了更好的控制并行操作,我们可以使用System.Threading.Tasks中的Task类。我们首先来了解是什么是任务——任务表示将要完成的一个或某个工作单元,这个工作单元可以在单独线程中运行,也可以使用同步方式启动运行(需要等待主线程调用)。为什么使用任务呢?——任务不仅可以获得一个抽象层(将要完成的工作单元)、还可以对底层的线程运行进行更好更多的控制(任务的运行)。
使用线程池的任务
我们讲到使用任务可以更好更多的控制底层的线程。就涉及到——线程池,线程池提供的是一个后台线程的池。线程池独自管理线程、根据需求增加或减少线程数。使用完成的线程返回至线程池中。我们下面就看看创建任务:
我们看下创建任务的几种方式:
1、使用实例化的TaskFactory类,然后使用其StartNew方法启动任务。
2、使用Task静态的Factory以来访问TaskFactory,然后调用StartNew方法启动任务。与第一种相似,但是对工厂的创建的控制就没那么全面。
3、使用Task的构造函数,实例化Task对象来指定创建任务,然后通过Start()方法进行启动任务。
4、使用Task.Run方法来立即启动任务。
我们看下以上方法创建的任务有何区别和相同吧,看代码:
private static object _lock = new object();
public static void TaskMethond(object item) { lock (_lock) { Console.WriteLine(item?.ToString()); Console.WriteLine($"任务Id:{Task.CurrentId?.ToString() ?? "没有任务运行"}\t 线程Id:{Thread.CurrentThread.ManagedThreadId}"); Console.WriteLine($"是否是线程池中的线程:{Thread.CurrentThread.IsThreadPoolThread}"); Console.WriteLine($"是否是后台线程:{Thread.CurrentThread.IsBackground}"); Console.WriteLine(); } } #region 任务创建 public static void TaskCreateRun() { var taskFactory = new