下表为多线程操作常见对象:

对象 方法/属性 描述 用途 用法 性能
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;
ThreadPool.QueueUserWorkItem((state) =>
{

}, 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(线程)

  官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.thread?redirectedfrom=MSDN&view=netframework-4.7.2

  原生的线程对象,性能相对较低,无法共用现有线程。每次都会创建一个新的线程,涉及到线程的销毁、创建,所以性能相对较低。不建议使用;

  示例:

     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的更多相关文章

  1. Java基础-进程与线程之Thread类详解

    Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...

  2. iOS多线程之Thread

    多线程 • Thread 是苹果官方提供的,简单已用,可以直接操作线程对象.不过需要程序员自己管理线程的生命周期,主要是创建那部分 优缺点 面向对象,简单易用 直接操作线程对象 需要自己管理线程生命周 ...

  3. Java多线程之Thread、Runnable、Callable及线程池

    一.多线程 线程是指进程中的一个执行流程,一个进程中可以有多个线程.如java.exe进程中可以运行很多线程.进程是运行中的程序,是内存等资源的集合,线程是属于某个进程的,进程中的多个线程共享进程中的 ...

  4. java--多线程之Thread继承

    多线程,是java的特殊机制.所谓线程就是程序执行的流程.“多线程”就是可以在同一时刻能够执行多个程序块(注意,是程序块,而不是程序),这样一来就可以使得程序的执行速度大大增加. package Te ...

  5. Android线程之Thread 、Runnable 的两个例子

    Thread例子: package fy.test; import android.app.Activity; import android.os.Bundle; import android.os. ...

  6. (一)java多线程之Thread

    本人邮箱: kco1989@qq.com 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://github.com/kco198 ...

  7. 多线程之Thread

    Thread类可以创建和控制线程,Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数. Thread类默认创建的是前台线程,所以我 ...

  8. C# 多线程之Thread类

    使用System.Threading.Thread类可以创建和控制线程. 常用的构造函数有:   // 摘要: // 初始化 System.Threading.Thread 类的新实例,指定允许对象在 ...

  9. 多线程之Thread类

    Java并发编程:Thread类的使用 在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知 ...

随机推荐

  1. Win8 Metro(C#)数字图像处理--3.1图像均值计算

    原文:Win8 Metro(C#)数字图像处理--3.1图像均值计算 /// <summary> /// Mean value computing. /// </summary> ...

  2. axure跨inframe传递参数

    在global variable添加loginuser变量 在link to and external url or file添加如下:[[Item.action]]#loginuser=[[logi ...

  3. UWP 浏览本地图片及对图片的裁剪

    原文:UWP 浏览本地图片及对图片的裁剪 1.前言 准备给我的校园助手客户端添加一个修改头像的功能,但是查了好多资料都没有找到裁剪图片的简单的方法,最后才找到这个使用Launcher调用系统组件的简单 ...

  4. CPU和GPU双低效,摩尔定律之后一万倍 ——写于TPU版AlphaGo重出江湖之际

    本文来自计算机体系结构专家王逵.他认为,“摩尔定律结束之后,性能提升一万倍”不会是科幻,而是发生在我们眼前的事实.   2008年,<三体2:黑暗森林>里写到:   真的很难,你冬眠后不久 ...

  5. Visual Studio 2017报表RDLC设计器与工具箱中Report Viewer问题

    原文:VS2017入门 RDLC入门之01 本系列所有内容为网络收集转载,版权为原作者所有. VS2017初始安装后和VS2015一样,都没有ReportDesigner/ReportViewer R ...

  6. 零元学Expression Blend 4 - Chapter 11 用实例了解布局容器系列-「Border」

    原文:零元学Expression Blend 4 - Chapter 11 用实例了解布局容器系列-「Border」 将教大家以实做案例认识Blend 4 的布局容器,此章介绍的布局容器是Blend ...

  7. duilib菜单开发遇见“0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突”

    我的程序是这样一个逻辑. 首先创建用户列表,点击列表项弹出菜单,点击菜单上“设备选项”,弹出设备列表,上面显示这个用户拥有的设备. 菜单的创建参考了这为博主的教程:http://www.cnblogs ...

  8. DBLINK学习

    1.连接本地scott用户查看拥有的表 [oracle@ORADG ~]$ sqlplus scott/tiger SQL> select * from tab; TNAME           ...

  9. 似乎是VS2017的一个BUG

    VS版本:2017(15.9.13) 新建一个c#控制台项目,把Program.cs的内容替换成如下: namespace ConsoleApp1 { class Program { static v ...

  10. Android WebView设置背景透明

    Adndroid 2.x的设置 在Android 2.x下,设置webview背景为透明的方法: wvContent.setBackgroundColor(0); Adndroid 4.0 由于硬件加 ...