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

对象 方法/属性 描述 用途 用法 性能
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. C#基础加强篇—委托、Lambda表达式和事件(下)

    3.事件 事件作为C#中的一种类型,为类和类的实例定义发出通知的能力,从而将事件和可执行代码捆绑在了一起.事件是对象发送的消息,以发信号通知操作的发生.操作可能是由用户交互引起的,也可能是由某些其他的 ...

  2. 八荣八耻 IT版

    八荣八耻 IT版以可配置为荣,以硬编码为耻:以系统互备为荣,以系统单点为耻:以随时可重启为荣,以不能迁移为耻:以整体交付为荣,以部分交付为耻:以无状态为荣,以有状态为耻:以标准化为荣,以特殊化为耻:以 ...

  3. SQL Server 2017 SELECT…INTO 创建的新表指定到文件组

    原文:SQL Server 2017 SELECT-INTO 创建的新表指定到文件组 SELECT-INTO 在 SQL Server 中也是常见的一个功能,过去用此方法创建的新表只能存储到默认的文件 ...

  4. Java HashMap实现原理 源码剖析

    HashMap是基于哈希表的Map接口实现,提供了所有可选的映射操作,并允许使用null值和null建,不同步且不保证映射顺序.下面记录一下研究HashMap实现原理. HashMap内部存储 在Ha ...

  5. A simple in-process HTTP server for UWP

    原文 http://www.dzhang.com/blog/2012/09/18/a-simple-in-process-http-server-for-windows-8-metro-apps 简单 ...

  6. 反汇编分析__stdcall和__cdecl的异同

    C++代码如下:.h头文件 #pragma once#ifdef DLLTestAPI#else#define DLLTestAPI _declspec(dllimport)#endifint DLL ...

  7. Codility---BinaryGap

    Task description A binary gap within a positive integer N is any maximal sequence of consecutive zer ...

  8. 【对象属性复制】BeanUtils.copyProperties(obj1, obj2);

    实现对象的属性值复制,只会复制命名相同的文件. import org.springframework.beans.BeanUtils; BeanUtils.copyProperties(obj1, o ...

  9. Shell学习笔记1》转载自runnoob

    无论是shell 还是bat,都是与操作系统结合非常紧密的东西,所以在此占坑,希望有朝一日能够把这些东西融会贯通,于是在此占坑~ 学习地址:http://www.runoob.com/linux/li ...

  10. 搭建本地pip源

    搭建本地的pip源 开发环境部署机器的时候, 每次从网上下载pip包会很慢, 将需要的包和相关依赖下载到本地, 搭建一个本地源服务器. 基本都是安装多个包, 推荐使用文件的方式, 文件内容格式, 可以 ...