速度(最快为1) 返回值 多参数 等待在时限内完成 超时后结束
ThreadPool.UnsafeQueueUserWorkItem() 1 非原生支持1 非原生支持 非原生支持3 不支持
ThreadPool.QueueUserWorkItem() 2.7 非原生支持1 非原生支持 非原生支持3 不支持
Task() 4.5 支持2 非原生支持 支持 自愿结束
Delegate.BeinInvoke() 25.4 非原生支持1 支持 支持4 不支持
Thread.Start() 11009 非原生支持1 非原生支持 非原生支持3 支持
  1. 如ThreadPool.UnsafeQueueUserWorkItem(()=>result=Add(1,2));

  2. 用Task<>

  3. 里面在程序末尾EventWaitHandle.Set(),外面WaitOne(TimeSpan)。

  4. 获得BeginInvoke的返回值asyncResult,再调asyncResult.AsyncWaitHandle.WaitOne();

有图有真相。这是各种异步方法循环调用N次所需的时间。

代码如下:

     static void Main(string[] args)
{
Action threadStart = (() => { });
WaitCallback waitCallback = new WaitCallback(a => { });
Stopwatch stopWatch = new Stopwatch(); stopWatch.Reset();
stopWatch.Start();
for (int i = ; i < ; i++)
{
System.Threading.ThreadPool.UnsafeQueueUserWorkItem(waitCallback, null);
}
stopWatch.Stop();
Console.WriteLine("{0,-40}{1}", "ThreadPool.UnsafeQueueUserWorkItem():", stopWatch.ElapsedTicks);
GC.Collect(); stopWatch.Reset();
stopWatch.Start();
for (int i = ; i < ; i++)
{
System.Threading.ThreadPool.QueueUserWorkItem(waitCallback);
}
stopWatch.Stop();
Console.WriteLine("{0,-40}{1}", "ThreadPool.QueueUserWorkItem():", stopWatch.ElapsedTicks);
GC.Collect(); stopWatch.Reset();
stopWatch.Start();
for (int i = ; i < ; i++)
{
Task t = new Task(threadStart);
t.Start();
}
stopWatch.Stop();
Console.WriteLine("{0,-40}{1}", "Task():", stopWatch.ElapsedTicks);
GC.Collect(); stopWatch.Reset();
stopWatch.Start();
for (int i = ; i < ; i++)
{
threadStart.BeginInvoke(null, null);
}
stopWatch.Stop();
Console.WriteLine("{0,-40}{1}", "Delegate.BeinInvoke():", stopWatch.ElapsedTicks); }

注意,上面BeginInvoke的用法并不完整,应当再调用EndInvoke。但是鉴于BeginInvoke已经最慢了,EndInvoke便不加了。

所以,如果无需返回值,一般就用ThreadPool吧,要更多控制,就Task。鄙人想不到用BeginInvoke的时机。

BeginInvoke、ThreadPool、Task三类异步方法的区别和速度比较的更多相关文章

  1. 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 ...

  2. 从Thread,ThreadPool,Task, 到async await 的基本使用方法解读

    记得很久以前的一个面试场景: 面试官:说说你对JavaScript闭包的理解吧? 我:嗯,平时都是前端工程师在写JS,我们一般只管写后端代码. 面试官:你是后端程序员啊,好吧,那问问你多线程编程的问题 ...

  3. Thread,ThreadPool,Task, 到async await 的基本使用方法和理解

    很久以前的一个面试场景: 面试官:说说你对JavaScript闭包的理解吧? 我:嗯,平时都是前端工程师在写JS,我们一般只管写后端代码. 面试官:你是后端程序员啊,好吧,那问问你多线程编程的问题吧. ...

  4. C#并行开发_Thread/ThreadPool, Task/TaskFactory, Parallel

    大家好,本次讨论的是C#中的并行开发,给力吧,随着并行的概念深入,哥也赶上这个潮流了,其实之前讨论C#的异步调用或者C#中BeginInvoke或者Invoke都已经涉及了部分本篇的内容. 参考书目: ...

  5. 异步和多线程,委托异步调用,Thread,ThreadPool,Task,Parallel,CancellationTokenSource

    1 进程-线程-多线程,同步和异步2 异步使用和回调3 异步参数4 异步等待5 异步返回值 5 多线程的特点:不卡主线程.速度快.无序性7 thread:线程等待,回调,前台线程/后台线程, 8 th ...

  6. C# Task和异步方法

    本文主要参考: https://www.cnblogs.com/qtiger/p/13497807.html ThreadPool中有若干数量的线程.当有任务需要处理时,会从线程池中获取一个空闲的线程 ...

  7. Thread,ThreadPool,Task

    线程分为前台和后台.比如我们直接new一个Thread这就是前台线程. 前台线程一定会执行. 比如我们创建2个线程:1号,2号,同时执行,假设1号是主线程,1执行完了,依旧会等待2执行完成,整个程序才 ...

  8. 异步多线程 Thread ThreadPool Task

    一.线程 Thread ThreadPool 线程是Windows任务调度的最小单位,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以 ...

  9. 浅析C#中的Thread ThreadPool Task和async/await

    .net 项目中不可避免地要与线程打交道,目的都是实现异步.并发.从最开始的new Thread()入门,到后来的Task.Run(),如今在使用async/await的时候却有很多疑问. 先来看一段 ...

随机推荐

  1. USB枚举过程(1)

    总的过程 ① host检测到device,reset 获取设备描述符 host发获取设备描述符请求 ->setup ->data0 <-ack Divice 返回设备描述符 -> ...

  2. SQL嵌套查寻初识,以及SOME ANY EXISTS的基础常识

    定义: 1 .指在一个外层查询中包含有另一个内层查询.其中外层查询称为主查询,内层查询称为子查询. 2 .SQL允许多层嵌套,由内而外地进行分析,子查询的结果作为主查询的查询条件 3 .子查询中一般不 ...

  3. hdoj 1729 Stone Games(SG函数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1729 看了题目感觉像Nim,但是有范围限制,有点不知道SG函数该怎么写 看了题解,最后才明白该怎么去理 ...

  4. 利用HTML5开发Android(6)---构建HTML5离线应用

    需要提供一个cache manifest文件,理出所有需要在离线状态下使用的资源例如 Manifest代码 CACHE MANIFEST #这是注释 images/sound-icon.png ima ...

  5. 优化checkbox和radio,类似Bootstrap中的iCheck

    checkbox和radio浏览器默认的已经满足不了大众的审美需求,更不用说浏览器之间的差异化,取而代之,优化checkbox和radio的方法也随之诞生了. html结构:单选框为例,简单说明: 其 ...

  6. Castle IOC容器内幕故事(上)

    主要内容 1.WindsorContainer分析 2.MicroKernel分析 3.注册组件流程 一.WindsorContainer分析 WindsorContainer是Castle的IOC容 ...

  7. C# 特性详解(上)

    特性(attribute)是被指定给某一声明的一则附加的声明性信息. 元数据,就是C#中封装的一些类,无法修改.类成员的特性被称为元数据中的注释.     1.什么是特性 1)属性与特性的区别  属性 ...

  8. mysql 清除数据库数据

    select Concat('TRUNCATE TABLE ', TABLE_NAME, ';') from INFORMATION_SCHEMA.TABLES

  9. Keil MDK AGDI Drivers, ULink, JLink, ST-Link, NuLink, JTAGjet

    AGDI Drivers AGDI is an Application Program Interface (API) third-party developers can use to create ...

  10. STM32 使用 printf 发送数据配置方法 -- 串口 UART, JTAG SWO, JLINK RTT

    STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) http://home.eeworld.com.cn/my/space-uid-338727-blogid-47 ...