使用ThreadPool代替Thread

线程的空间开销

  1. 线程内核对象。包含上下文信息。32位系统占用700字节
  2. 线程环境块。包括线程的异常处理链。32位系统占用4KB
  3. 用户模式栈。保存方法的参数、局部变量和返回值
  4. 内核模式栈。调用操作系统的内核模式函数时,系统会将函数参数从用户模式栈复制到内核模式栈。32位系统占用12KB

线程的时间开销

  1. 创建时,系统相继初始化上述内存空间
  2. CLR加载DLL到DLLMain方法,并传送连接标志
  3. 线程上下文切换
    1. 进入内核模式
    2. 将上下文信息保存到正在执行的线程内核对象上
    3. 系统获取一个Spinlock,并确定下一个要执行的线程。释放Spinlock。如果下一个线程不在同一个进程,则需要进行虚拟地址交换
    4. 从将被执行的线程内核对象上载入上下文信息
    5. 离开内核模式

使用线程池,CLR不会销毁这个线程,而是会保留这个线程一段时间。

using System;
using System.Diagnostics;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var p = new Program();
            Stopwatch sw = new Stopwatch();
            sw.Start();
            p.Thread();
            sw.Stop();
            Console.WriteLine(sw.ElapsedTicks);
            sw.Restart();
            p.Pool();
            sw.Stop();
            Console.WriteLine(sw.ElapsedTicks);
            Console.ReadKey();
        }

        void Thread()
        {
            for (int i = 0; i < 10; i++)
            {
                var worker = new Thread(() =>
                {
                    //Console.WriteLine("Thread Do");
                });
                worker.Start();
            }
        }

        void Pool()
        {
            for (int i = 0; i < 10; i++)
            {
                ThreadPool.QueueUserWorkItem(state =>
                {
                    //Console.WriteLine("Pool Do");
                });
            }
        }
    }
}
时间: 2024-10-03 13:47:36

使用ThreadPool代替Thread的相关文章

改善C#程序的建议9:使用Task代替ThreadPool和Thread

一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: 1: ThreadPool不支持线程的取消.完成.失败通知等交互性操作: 2: ThreadPool不支持线程执行的先后次序: 以往,如果开发者要实现上述功能,需要完成很多额外的工作,现在,FCL中提供了一个功能更强大的概念:Task.Task在线程池的基础上进行了优化,并提供了更多的API.在FCL4.0中,如果我们要编写多线程程序,Task显然已经优于传统的

使用Task代替ThreadPool和Thread

GPS平台.网站建设.软件开发.系统运维,找森大网络科技!http://cnsendnet.taobao.com来自森大科技官方博客http://www.cnsendblog.com/index.php/?p=435 一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: 1: ThreadPool不支持线程的取消.完成.失败通知等交互性操作: 2: ThreadPool不支持线程执行的先后次序: 以往,如果开发者要

C#ThreadPool与Thread

void Example() { // 连接 ProcessFile 方法到线程池. //注意: 'a' 是一个作为参数的对象 ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessFile), a); } private void ProcessFile(object a) { // 我被连接到线程池通过 WaitCallback. } 先贴出这一段线程池调用的方式,Thread类使用比较简单. Thread thread = new Thr

C# 的 Task、Thread、ThreadPool 之间有什么异同?

Thread就是Thread,需要自己调度,适合长跑型的操作. ThreadPool是Thread基础上的一个线程池,目的是减少频繁创建线程的开销.线程很贵,要开新的stack,要增加CPU上下文切换,所以ThreadPool适合频繁.短期执行的小操作.调度算法是自适应的,会根据程序执行的模式调整配置,通常不需要自己调度线程.另外分为Worker和IO两个池.IO线程对应Native的overlapped io,Win下利用IO完成端口实现非阻塞IO. Task或者说TPL是一个更上层的封装,N

Whether Thread Pool is Needed for You?

你到底需不需要内存池? 先问自己两个问题: 是否有很多请求需要重复性的进行处理? 而且每个请求是相互独立的? 你是否需要等待IO操作,或是文件操作? 如果你回答YES,那么你需要一个线程池来帮助你. 我们为什么需要内存池? 通常情况下,IO操作都会需要很长的一段时间才能完成.所以,在一个单线程的应用程序中,在IO操作期间,系统资源都会进行等待.如果使用多线程,效率就会大大的提高.所以我们需要线程池更高效的完成多线程操作. 内存池会有什么样的作用? 一个应用程序其实应该避免频繁的创建和销毁线程.

Python多线程实现方法有几种

目前python多线程实现方式有很多种比如:thread,threading,multithreading ,其中thread模块比较底层,而threading模块是对thread做了一些包装,可以更加方便的被使用. 2.7 版本之前python对线程的支持还不够完善,不能利用多核CPU,但是2.7版本的python中已经考虑改进这点,出现了 multithreading模块.threading模块里面主要是对一些线程的操作对象化,创建Thread的class.一般来说,使用线程有两种 模式:

多线程的秘密

一.线程的定义  1. 1 进程.应用程序域与线程的关系 进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.进程之间是相对独立的,一个进程无法访问另一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其他进程的运行,Windows系统就是利用进程把工作划分为多个独立的区域的.进程可以理解为一个程序的基本边界. 应用程序域(AppDomain)是一个程序运行的逻辑区域,它可以视为一个轻量级的进程,.NET的程序集正是在应用程序域中运行的

[转]C#综合揭秘——细说多线程(上)

C#综合揭秘——细说多线程(上) 引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发.其中委托的BeginInvoke方法以及回调函数最为常用.而 I/O线程可能容易遭到大家的忽略,其实在开发多线程系统,更应该多留意I/O线程的操作.特别是在ASP.NET开发当中,可能更多人只会留意在客户端使用Ajax或者在服务器端使用UpdatePanel.其实合理使用I/O线程在通讯项目或文件下载时,能尽可能地减少IIS的压力.并行编程

(译)Asynchronous programming and Threading in C# (.NET 4.5)

原文地址:http://www.codeproject.com/Articles/996857/Asynchronous-programming-and-Threading-in-Csharp-N 介绍: Asynchronous programming and threading is very important feature for concurrent or parallel programming. Asynchronous programming may or may not us