异步多线程之Parallel详解
上一篇:异步多线程之入Task
下一篇:异步多线程使用中的常见问题
简介
Parallel 叫做并行编程 .Net 4.5 时代的,基于 Task 基础上做了封装。Parallel 的特点方便控制线程并发数量与节省一个线程。
API
Parallel 相对来说也比较简单,这里介绍几个 API(Invoke、For、ForEach)的用法,这三个 API 都可以节约一个线程。
Invoke
例如:Invoke 方法可以做并发,传入委托即可。这里并发 3 任务,如下
public static void Coding(string name, string module)
{Console.WriteLine($"{name} Coding Start {module},ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");Console.WriteLine($"{name} Coding End {module},ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");
}static void Main(string[] args)
{Console.WriteLine($"Main Start,ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");Parallel.Invoke(() => Coding("张三", "Web"), () => Coding("李四", "Service"), () => Coding("王五", "SQL"));Console.WriteLine($"Main End,ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");Console.ReadLine();
}
启动程序,可以看到 3 个任务并发执行,会卡界面。但只有三个线程(1-主线程,3、4-子线程),节约一个线程。
For
For 也是一样的,主线程参与计算,节约一个线程。
public static void Coding(string name, string module)
{Console.WriteLine($"{name} Coding Start {module},ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");Console.WriteLine($"{name} Coding End {module},ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");
}static void Main(string[] args)
{Console.WriteLine($"Main Start,ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");Parallel.For(0, 5, i =>{Coding("张三"+ i.ToString(), "Web" + i.ToString());});Console.WriteLine($"Main End,ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");Console.ReadLine();
}
ForEach
For 也是一样的,主线程参与计算,节约一个线程。
public static void Coding(string name, string module)
{Console.WriteLine($"{name} Coding Start {module},ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");Console.WriteLine($"{name} Coding End {module},ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");
}static void Main(string[] args)
{Console.WriteLine($"Main Start,ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");Parallel.ForEach(new int[] { 2, 4, 6, 8 }, i =>{Coding("张三" + i.ToString(), "Web" + i.ToString());});Console.WriteLine($"Main End,ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");Console.ReadLine();
}
限定线程数量
Parallel 限定线程数量也是比较简单的,使用 ParallelOptions 设置一下即可。如下
public static void Coding(string name, string module)
{Console.WriteLine($"{name} Coding Start {module},ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");Console.WriteLine($"{name} Coding End {module},ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");
}static void Main(string[] args)
{Console.WriteLine($"Main Start,ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");ParallelOptions parallelOptions = new ParallelOptions();parallelOptions.MaxDegreeOfParallelism = 3;Parallel.For(0, 10, parallelOptions, i =>{Coding("张三" + i.ToString(), "Web" + i.ToString());});Console.WriteLine($"Main End,ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");Console.ReadLine();
}
如何不卡线程?答案:还是老套路,包一层。如下
public static void Coding(string name, string module)
{Console.WriteLine($"{name} Coding Start {module},ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");Console.WriteLine($"{name} Coding End {module},ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");
}static void Main(string[] args)
{Console.WriteLine($"Main Start,ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");Task.Run(() =>{ParallelOptions parallelOptions = new ParallelOptions();parallelOptions.MaxDegreeOfParallelism = 3;Parallel.For(0, 10, parallelOptions, i =>{Coding("张三" + i.ToString(), "Web" + i.ToString());});});Console.WriteLine($"Main End,ThreadId:{Thread.CurrentThread.ManagedThreadId},Datetime:{DateTime.Now.ToLongTimeString()}");Console.ReadLine();
}
异步多线程之Parallel详解相关推荐
- 异步多线程之ThreadPool详解
上一篇:异步多线程之Thread 下一篇:异步多线程之入Task 介绍 ThreadPool 是 .net 2.0 时代的产物,有了 Thread 为什么还会有 ThreadPool 呢?Thread ...
- 异步多线程之Thread详解
上一篇:异步多线程之入门介绍 下一篇:异步多线程之入ThreadPool 介绍 Thread 是 1.0 时代的产物,当时 C# 就考虑到了多线程,于是就设计了 Thread .其实现在不推荐使用,除 ...
- Java多线程之volatile详解
Java多线程之volatile详解 目录: 什么是volatile? JMM内存模型之可见性 volatile三大特性之一:保证可见性 volatile三大特性之二:不保证原子性 volatile三 ...
- 多线程之callable详解
多线程之callable详解 面试有人会问:线程的实现方式有几种? 很多人可能回答:2种,继承Thread类,实现Runnable接口. 很多忽略了callable这种方式. 也许有人知道callab ...
- 多线程之ThreadPoolExecutor详解
一.为什么使用ThreadPoolExecutor来创建线程池 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程. 因为线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解 ...
- java多线程之ThreadLoal详解
一.ThreadLocal简介 多线程访问同一个共享变量时特别容易出现并发问题,特别是在多个线程需要对一个共享变量进行写入时.为了保证线程安全,一般使用者在访问共享变量时需要进行适当的同步 同步一般是 ...
- Java多线程之Synchronized详解
一直以来对于Synchronized都比较迷惑,尤其还对于ReentrantLock并不了解他们之间的区别,今天闲来无事,学习了. 1,为什么要使用Synchronized 首先看Synchroniz ...
- python移动平均线绘图_对python pandas 画移动平均线的方法详解
数据文件 66001_.txt 内容格式: date,jz0,jz1,jz2,jz3,jz4,jz5 2012-12-28,0.9326,0.8835,1.0289,1.0027,1.1067,1.0 ...
- php js跨域上传文件,Jquery实现跨域异步上传文件步骤详解
这次给大家带来Jquery实现跨域异步上传文件步骤详解,Jquery实现跨域异步上传文件的注意事项有哪些,下面就是实战案例,一起来看一下. 先说明白 这个跨域异步上传功能我们借助了Jquery.for ...
最新文章
- 抢程序员饭碗?自动写代码的Deep TabNine真如此神奇?
- 汇总c#.net常用函数和方法集
- 关于WEB ServiceWCFWebApi实现身份验证之WebApi篇
- 数据结构实验之图论九:最小生成树_每天5分钟用C#学习数据结构(25)图 Part 6
- 解决ntfs格式的移动硬盘mount到Linux下时变成只读文件系统的问题
- 卷积神经网络minst的verilog实现
- JS删除之前弹出一个带有确认和取消按钮的提示框confirm()
- 工作312:uni-时间戳处理
- mysql存储过程参数与属性同名问题_存储过程中参数与表名相同的二义性问题
- Kafka—配置SASL/PLAIN认证客户端及常用操作命令
- 第1关:创建/删除节点
- 学习总结——工作中的性能测试完整过程
- Java菜鸟教程 for循环和while循环
- (个人)AR电子书系统创新实训第三周(1)
- b站视频素材哪里找?怎么找b站素材?
- 微软反linux广告图片,一张地铁站“前程无忧广告”的图片引发网友热议 官方:虚假图片...
- 黑马程序员C++笔记
- 最优化方法——0.618法matlab实现
- C Primer Plus 第五章 编程练习
- LabVIEW视觉采集软件(VAS)、视觉生成器(VB)和视觉开发模块(VDM)之间有什么不同