关于Thread ThreadPool Parallel 的一些小测试demo
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks; namespace TestProject
{
class Program
{
//异步:不阻塞主线程的一种编程方法
//多线程(new Thread): 多个线程去做一个事情 (注意共享变量的问题)(无法监测是否完成)
//线程池(new ThreadPool):省去线程重复创建回收的消耗。(无法检测执行任务是否完成)
//Task: Task在线程池的基础上进行了优化,并且可以检测到完成状态。
//Parallel:并行多个任务。(而且能监测完成状态)
//乐观锁悲观锁
static void Main(string[] args)
{
//int a = 0;
Stopwatch stopwatch = new Stopwatch(); #region 单线程
stopwatch.Start(); // 开始监视代码运行时间
for (int i = ; i < ; i++)
{
Console.WriteLine("thread:{0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep();
}
// you code ....
stopwatch.Stop(); // 停止监视
ConsoleTime(stopwatch, "单线程");
#endregion #region ThreadPool(没办法检测是否完成哦!)这里监测到的时间是创建线程池所需要的时间
stopwatch.Start(); // 开始监视代码运行时间 ThreadPool.SetMaxThreads(, );
ThreadPool.SetMinThreads(, );
for (int i = ; i < ; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback((obj) =>
{
Console.WriteLine("线程池输出: thread:{0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep();
}), i.ToString());
}
// you code ....
stopwatch.Stop(); // 停止监视
ConsoleTime(stopwatch, "ThreadPool");
#endregion #region Thread(没办法检测完成!没有返回值没有办法检测状态。)这里监测到的时间仅仅只是创建这些线程所需要的时间。
stopwatch.Start(); // 开始监视代码运行时间
for (int i = ; i < ; i++)
{
Thread thread = new Thread(new ThreadStart(DoSomeThing));
thread.Start();
//Thread.Sleep(100);
}
// you code ....
stopwatch.Stop(); // 停止监视
ConsoleTime(stopwatch, "Thread");
#endregion #region Parallel
stopwatch.Start(); // 开始监视代码运行时间
var task = System.Threading.Tasks.Parallel.For(, , new ParallelOptions() { MaxDegreeOfParallelism = }, (i) =>
{
Console.WriteLine("{0},task:{1},thread:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
Task.Delay();
//提供的原子性操作,保证对a的值操作每一次都是原子性的
//System.Threading.Interlocked.Add(ref a, 1);
//a++;
});
stopwatch.Stop(); // 停止监视
ConsoleTime(stopwatch, "Parallel");
#endregion //Console.Write(a);
Console.ReadKey();
}
/// <summary>
/// 模拟做点什么同时输出当前线程id
/// </summary>
private static void DoSomeThing()
{
Console.WriteLine("DoSomeThing: thread:{0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep();
}
/// <summary>
/// 模拟异步执行方法
/// </summary>
/// <returns></returns>
private static async Task DoSomeThing2()
{
await Task.Run(() =>
{
Console.WriteLine("DoSomeThing2: task:{0},thread:{1}", Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep();
}
);
}
//输出当前代码段运行时间
private static void ConsoleTime(Stopwatch stopwatch, string BlockName)
{
TimeSpan timespan = stopwatch.Elapsed; //获取当前实例测量得出的总时间
Console.WriteLine("{0} ,代码执行时间:{1}(毫秒)", BlockName, timespan.TotalMilliseconds); //总毫秒数
stopwatch.Reset();
} }
}
关于Thread ThreadPool Parallel 的一些小测试demo的更多相关文章
- Thread&ThreadPool、Parallel、Async和Await用法总结
1.线程和线程池Thread&ThreadPool //线程初始化时执行方法可以带一个object参数,为了传入自定义参数,所以执行需单独调用用于传参. Console.WriteLine(& ...
- c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
c#中@标志的作用 参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...
- 从Thread,ThreadPool,Task, 到async await 的基本使用方法解读
记得很久以前的一个面试场景: 面试官:说说你对JavaScript闭包的理解吧? 我:嗯,平时都是前端工程师在写JS,我们一般只管写后端代码. 面试官:你是后端程序员啊,好吧,那问问你多线程编程的问题 ...
- Thread,ThreadPool,Task, 到async await 的基本使用方法和理解
很久以前的一个面试场景: 面试官:说说你对JavaScript闭包的理解吧? 我:嗯,平时都是前端工程师在写JS,我们一般只管写后端代码. 面试官:你是后端程序员啊,好吧,那问问你多线程编程的问题吧. ...
- Cad 二次开发关于SelectCrossingPolygon和SelectFence返回结果Status为error的小测试
CAD2008的二次开发,有个很奇怪的现象,只要你选择的点集不在当前视图上SelectCrossingPolygon和SelectFence返回结果Status就会为error,所以要获取正确的结果, ...
- 异步多线程 Thread ThreadPool Task
一.线程 Thread ThreadPool 线程是Windows任务调度的最小单位,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以 ...
- python 程序小测试
python 程序小测试 对之前写的程序做简单的小测试 ... # -*- encoding:utf-8 -*- ''' 对所写程序做简单的测试 @author: bpf ''' def GameOv ...
- PHP中使用PDO操作事务的一些小测试
关于事务的问题,我们就不多解释了,以后在学习 MySQL 的相关内容时再深入的了解.今天我们主要是对 PDO 中操作事务的一些小测试,或许能发现一些比较好玩的内容. 在 MyISAM 上使用事务会怎么 ...
- android gps开发必备资料(含测试demo下载)
入门资料参考: How accurate is Android GPS? Part 1: Understanding Location Data How accurate is Android GPS ...
随机推荐
- spring + junit 测试
spring + junit 测试 需要一个工具类 package com.meizu.fastdfsweb; import org.junit.runner.RunWith; import org. ...
- jquery blur()函数 语法
jquery blur()函数 语法 作用:当元素失去焦点时发生 blur 事件.blur() 函数触发 blur 事件,或者如果设置了 function 参数,该函数也可规定当发生 blur 事件时 ...
- 2018蓝桥杯C/C++组第4题第几个幸运数
题目4标题:第几个幸运数 到x星球旅行的游客都被发给一个整数,作为游客编号.x星的国王有个怪癖,他只喜欢数字3,5和7.国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品. 我们来看前 ...
- 'findstr' 不是内部或外部命令,也不是可运行的程序或批处理文件
今天通过windows cmd客户端输入: solr.cmd start ,启动solr时,提示"findstr' 不是内部或外部命令,也不是可运行的程序或批处理文件" 这是PAT ...
- 25.Python逻辑运算符及其用法
逻辑运算符是对真和假两种布尔值进行运算(操作 bool 类型的变量.常量或表达式),逻辑运算的返回值也是 bool 类型值. Python 中的逻辑运算符主要包括 and(逻辑与).or(逻辑或)以及 ...
- zookeeper系列(五)zookeeper在大型分布式系统中的应用
作者:leesf 掌控之中,才会成功:掌控之外,注定失败. 出处:http://www.cnblogs.com/leesf456/p/6063694.html 尊重原创感谢博主公开这么好的博文, ...
- 实验四《Android程序设计》实验报告封面
实验四<Android程序设计>实验报告封面 课程:Java程序设计 班级:1753班 姓名:许钰玮 学号:20175329 指导教师:娄嘉鹏 实验日期:2019年5月13日 实验时间:1 ...
- css三类选择器 用法 引用
css(层叠样式表): css用法:选择符{样式属性:取值;...} css选择器的分类: ①:标签选择器,such as:p{attribute:value;},p为标签选择器的name,该页面中所 ...
- LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
题目描述 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, 3, 4] 解释: 1 ...
- VS Code 调试 Golang 出现 Failed to continue: Check the debug console for details
VS Code断点调试Golang时候,弹出提示:Failed to continue: Check the debug console for details 点击Open launch.json, ...