.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类之前,先介绍与线程相关知 ...
随机推荐
- sqlserver创建接受任何类型的nvl
if exists ( select * from sys.objects where object_id = object_id(N'dbo.nvl') and type = N'FN') begi ...
- Android零基础入门第2节:Android 系统架构和应用组件那些事
原文:Android零基础入门第2节:Android 系统架构和应用组件那些事 继上一期浅谈了Android的前世今生,这一期一起来大致回顾一下Android 系统架构和应用组件. 一.Android ...
- UWP SQLite的使用
原文:UWP SQLite的使用 1.准备工作 1.首先我们要给项目添加"SQLite for Universal Windows Platform"扩展 点击菜单栏的" ...
- windows 2003 无法安装 .net4.0 windows服务
错误: InstallUtil.InstallLog文件中的错误信息: 正在运行事务处理安装. 正在开始安装的“安装”阶段. 查看日志文件的内容以获得 D:\Debug\DataChang.e ...
- Elevate Web Builder for Web Developers(类似于unigui的东西)
推荐一款pascal 语言的web 开发工具 这几天仔细研究了一款使用Pascal 语言开发web 的工具 具体介绍可以参照这里. 先上几张他开发的页面照.
- 深入理解 Win32 PE 文件格式 Matt Pietrek(慢慢体会)
这篇文章假定你熟悉C++和Win32. 概述 理解可移植可执行文件格式(PE)可以更好地了解操作系统.如果你知道DLL和EXE中都有些什么东西,那么你就是一个知识渊博的程序员.这一系列文章的第一部分, ...
- [转]UE的职责
最近开始负责产品工作,从产品定位到需求文档再到原型设计,以及后续产品的路线规划,渐渐感觉忙不过来了.所以准备招一个UE/X来辅助. 以前做项目,也没接触过什么UE,所以对UE的工作不是很清楚,尤其是P ...
- 【Linux】Linux下跟踪记录每个用户对主机服务器进行的操作
linux中跟踪每个用户对主机的操作,看有人之前已经写过如此shell,可直接参考,参考如下: 1.记录操作信息 这个脚本需添加至/etc/profile 脚本如下: history USER_IP= ...
- SYN2102型 NTP网络时间服务器
SYN2102型 NTP网络时间服务器 ntp主时钟服务器ntp时钟服务器厂商使用说明视频链接: http://www.syn029.com/h-pd-57-0_310_1_-1.html 请将 ...
- 一线Python运维开发带你秒懂Flask框架
相信曾经纠结过这个问题:怎样才能彻底掌握flask? Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . ...