.NET多线程之Thread、Task、ThreadPool、Timer
下表为多线程操作常见对象:
| 对象 | 方法/属性 | 描述 | 用途 | 用法 | 性能 |
| Thread(线程) | Start | 启动线程,启动后线程处于System.Threading.ThreadState.Running状态 | 创建线程后,启动 | new Thread(()=>{}).Start(); | 中 |
| Sleep | 将当前线程挂起指定的毫秒数。 | 挂起当前线程1秒 | Thread.Sleet(1000) | ||
| Abort | 中止当前线程 | 停止后续代码运行 | Thread.CurrentThread.Abort() | ||
| CurrentThread | 获取当前线程对象 | 获取当前线程对象 | Thread.CurrentThread | ||
| CurrentPrincipal | 获取或设置线程的当前负责人(对基于角色的安全性而言)。 | 可通过ClaimsPrincipal在当前线程中存储相关申明,Abp中的DefaultPrincipalAccessor(IPrincipalAccessor)用来传递当前登陆人信息 | Thread.CurrentThread.ManagedThreadId | ||
| ManagedThreadId | 获取当前托管线程的唯一标识符。 | ||||
| Task(任务) | Run | 将在线程池上运行的指定工作排队,并返回 function 所返回的任务的代理项。 | Task.Run(()=>{}) | 高 | |
| Delay | 创建一个在指定的时间间隔后完成的任务。 | Task.Delay(1000). | |||
| WaitAll | 等待提供的所有 System.Threading.Tasks.Task 对象完成执行过程。 | 等待指定Task完成 | Task.WaitAll() | ||
| WaitAny | 等待提供的任一 System.Threading.Tasks.Task 对象完成执行过程。 | 等待任一一个任务完成即执行后续操作 | Task.WaitAny() | ||
| FromResult | 创建成功完成返回指定结果的任务 | 在异步开发模式中,常用于返回一个成功的任务,以达到异步调用的方式 | Task.FromResult(TResult) | ||
| Task<TResult> | Result | 获取此Task返回值 | |||
| ThreadPool(线程池) | QueueUserWorkItem | 将方法排入队列以便执行,并指定包含该方法所用数据的对象。 此方法在有线程池线程变得可用时执行。 |
object data = null; }, data); |
高 |
|
| System.Timers.Timer(定时器),是对System.Threading.Timer封装 | Start | 通过将 System.Timers.Timer.Enabled 设置为 true 开始引发 System.Timers.Timer.Elapsed 事件。 | 高 | ||
| Stop | 通过将 System.Timers.Timer.Enabled 设置为 false 停止引发 System.Timers.Timer.Elapsed 事件。 | ||||
| Close | 释放由 System.Timers.Timer 占用的资源。 | ||||
| AutoReset |
获取或设置一个布尔值,该值指示 System.Timers.Timer 是否应只引发一次 System.Timers.Timer.Elapsed 事件((false) 或重复 (true))。 |
应设置为true | |||
| Enabled | 获取或设置一个值,该值指示 System.Timers.Timer 是否应引发 System.Timers.Timer.Elapsed 事件。 | 应设置为true | |||
| Interval | 获取或设置引发 System.Timers.Timer.Elapsed 事件的间隔(以毫秒为单位)。 | ||||
|
System.Threading.Timer(定时器) |
高 |
1、Thread(线程)
原生的线程对象,性能相对较低,无法共用现有线程。每次都会创建一个新的线程,涉及到线程的销毁、创建,所以性能相对较低。不建议使用;
示例:
public void TestThread()
{
var thread = new Thread(() =>
{
Console.WriteLine($"3、Async Current Thread Id={Thread.CurrentThread.ManagedThreadId.ToString("")} Thread State={Thread.CurrentThread.ThreadState.ToString()}");
});
Console.WriteLine($"1、Async Current Thread Id={Thread.CurrentThread.ManagedThreadId.ToString("")} Thread State={thread.ThreadState.ToString()}");
thread.Start();
Console.WriteLine($"2、Async Current Thread Id={Thread.CurrentThread.ManagedThreadId.ToString("")} Thread State={thread.ThreadState.ToString()}");
Thread.Sleep();
Console.WriteLine($"4、Async Current Thread Id={Thread.CurrentThread.ManagedThreadId.ToString("")} Thread State={thread.ThreadState.ToString()}");
Console.WriteLine(Thread.GetDomainID());
}
2、Task(任务)
官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.tasks.task?view=netframework-4.7.2
Task是对ThreadPool的封装,支持等待,不直接创建线程和销毁线程,由ThreadPool管理创建和销毁。建议使用;
示例:
public void TestTask()
{
Console.WriteLine($"Async Current Thread Id={Thread.CurrentThread.ManagedThreadId}");
var tasks = new List<Task>();
for (var i = ; i < ; i++)
{
RunTask(i);
}
}
private Task RunTask(int i)
{
return Task.Run(() =>
{
Console.WriteLine($"Sync Current Thread Id={Thread.CurrentThread.ManagedThreadId.ToString("")} i={i.ToString("")}");
});
}
3、ThreadPool(线程池)
官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.threadpool?view=netframework-4.7.2
类似与ADO.NET数据库连接池,出发点都是用于统一管理线程的创建和销毁。如果异步任务不需要等待建议使用;
示例:
public void TestThreadPool()
{
object data = null;
ThreadPool.QueueUserWorkItem((state) =>
{
Console.WriteLine($"Sync Current Thread Id={Thread.CurrentThread.ManagedThreadId.ToString("")} i={i.ToString("")}");
}, data);
}
4、System.Timers.Timer定时器
System.Threading.Timer官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.timer?view=netframework-4.7.2
System.Timers.Timer官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.timers.timer?view=netframework-4.7.2
System.Timers.Timer定时器是对System.Threading.Timer封装,更加方便使用,使用那个看个人习惯;
示例:
public void TestTimer()
{
var hubTimer = new System.Timers.Timer( * )
{
AutoReset = true,
Enabled = true,
};
hubTimer.Elapsed += Run;//注册事件
hubTimer.Elapsed -= Run;//取消事件
hubTimer.Start();
} public void Run(object sender, ElapsedEventArgs e)
{ }
.NET多线程之Thread、Task、ThreadPool、Timer的更多相关文章
- Java基础-进程与线程之Thread类详解
Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...
- iOS多线程之Thread
多线程 • Thread 是苹果官方提供的,简单已用,可以直接操作线程对象.不过需要程序员自己管理线程的生命周期,主要是创建那部分 优缺点 面向对象,简单易用 直接操作线程对象 需要自己管理线程生命周 ...
- Java多线程之Thread、Runnable、Callable及线程池
一.多线程 线程是指进程中的一个执行流程,一个进程中可以有多个线程.如java.exe进程中可以运行很多线程.进程是运行中的程序,是内存等资源的集合,线程是属于某个进程的,进程中的多个线程共享进程中的 ...
- java--多线程之Thread继承
多线程,是java的特殊机制.所谓线程就是程序执行的流程.“多线程”就是可以在同一时刻能够执行多个程序块(注意,是程序块,而不是程序),这样一来就可以使得程序的执行速度大大增加. package Te ...
- Android线程之Thread 、Runnable 的两个例子
Thread例子: package fy.test; import android.app.Activity; import android.os.Bundle; import android.os. ...
- (一)java多线程之Thread
本人邮箱: kco1989@qq.com 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://github.com/kco198 ...
- 多线程之Thread
Thread类可以创建和控制线程,Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数. Thread类默认创建的是前台线程,所以我 ...
- C# 多线程之Thread类
使用System.Threading.Thread类可以创建和控制线程. 常用的构造函数有: // 摘要: // 初始化 System.Threading.Thread 类的新实例,指定允许对象在 ...
- 多线程之Thread类
Java并发编程:Thread类的使用 在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知 ...
随机推荐
- Win10《芒果TV》春季商店版更新v3.3.0:全新视觉蜕变&支持快男直播
在微软发布Win10创意者更新正式版前夕,Win10版<芒果TV>迅速更新至v3.3.0,主要是全新升级视觉交互,新增大咖快男个人直播,全面优化底层架构,启动大提速. Win10版< ...
- C# Lambda表达式Contains方法 like
原文:Lambda表达式Contains方法 like 1.使用Contains方法的必备条件: Contains等价于SQL中的like语句.不过Contains只针对于字符串(string)类型的 ...
- 微信小程序把玩(二十九)video组件
原文:微信小程序把玩(二十九)video组件 视频播放组件与图片加载组件也没啥差别,使用起来也没啥注意的 重要属性: wxml <!--监听button点击事件--> <button ...
- 压缩大文件时如何限制CPU使用率?----几种CPU资源限制方法的测试说明
一.说明 我们的MySQL实例在备份后需要将数据打包压缩,部分低配机器在压缩时容易出现CPU打满导致报警的情况,需要在压缩文件时进行CPU资源的限制. 因此针对此问题进行了相关测试,就有了此文章. 二 ...
- c# 可移动可改变大小的控件
因为业务需要,百度了个可移动可改变大小的控件,然后自己修改了下,功能类似vs的设计面板中的功能差不多,可拖拽,改变大小 拖动的 public class MoveControl { #region 自 ...
- qt中用tcp传输xml消息 good
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:Qt5 3.1.2 说明: 在tcp上传输xml消息. 协议格式如 ...
- 快速删除mysql表中的数据
一.清空全部数据,不写日志,不可恢复,速度很快 truncate table 表名; 二.清空全部数据,写日志,可恢复,速度很慢 delete from 表名;
- 627.Swap Salary-(LeetCode之Database篇)
问题描述 给出下面的表,名为salary. id name sex salary 1 A m 2500 2 B f 1500 3 C m 5500 4 D f 500 要求执行一个UPDATE语句,将 ...
- vue-cli3.x npm create projectName 报错: Unexpected end of JSON input while parsing near......
npm 版本与node版本还有webpack版本之间的问题 清理缓存,“ npm cache clean --force " 一切OK
- Application生命周期(一)
1.Application是什么? Application和Activity,Service一样,是android框架的一个系统组件,当android程序启动时系统会创建一个 application对 ...