IT知识库 购物 网址 游戏 小说 歌词 快照 开发 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 编程 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
  IT知识库 -> .NET新手区 -> 多线程编程学习笔记——线程池(一) -> 正文阅读

[.NET新手区]多线程编程学习笔记——线程池(一)

多线程编程学习笔记——线程池(一)  接上文 多线程编程学习笔记——线程同步(一)
 接上文 多线程编程学习笔记——线程同步(二)
  接上文 多线程编程学习笔记——线程同步(三)
      创建多线程操作是非常昂贵的,所以每个运行时间非常短的操作,创建多线程进行操作,可能并不能提高效率,反而降低了效率。
      如果你有非常多的执行时间非常短的操作,那么适合作用线程池来提高效率,而不是自行创建多线程。
      线程池,就是我们先分配一些资源到池子里,当我们需要使用时,则从池子中获取,用完了,再放回池子里。
     .NET中的线程池是受CLR管理的,TheadTool类有一个QueueUserWorkItem静态方法,这个静态方法接受一个委托,代表用户自定义的一个异步操作,在这个方法被调用之后,委托会进入到内部队列中,如果池中没有线程,则创建一个工作线程,把第一个委托放入工作线程。如果继续放入委托,则池创建新的工作线程,直到工作线程数量达到上限。这时再放入委托,则不会创建新的工作线程,而是在队列中等待,直到有空闲的工作线程。
       当线程池中所有操作都完成,而且没有新任务操作时,线程池会释放长时间不用的资源。
       注意:放入线程池中的操作需要的时间要短,不要把需要长时间运行的操作放入线程池中,或阻塞工作线程。这将导致性能问题和非常难以调用的问题。
                 在ASP.NET中使用线程池要当心,ASP.NET中的线程池是一个共用线程池,如果线程池中的工作线程都用完了,则会造成WEB服务器对正常的HTTP请求无法提供服务。
一、     线程池中调用委托
 1.代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; 

namespace ThreadPoolDemo
{
 

    public delegate string ThreadPoolRun(out int threadId);
    class Program
    {  

        static void Main(string[] args)
        {

            Console.WriteLine("开始测试线程池-委托。。。");
            int threadId = 0;
            ThreadPoolRun poolDele = RunThread;
            var t = new Thread(() => RunThread(out threadId));
            t.Start();
            t.Join();
            Console.WriteLine("线程ID {0} ",threadId);
            IAsyncResult r = poolDele.BeginInvoke(out threadId, Callback, "在线程池中同步调用回调函数");
            string result = poolDele.EndInvoke(out threadId, r);
            Console.WriteLine("线程池中工作线程ID :{0}", threadId);
            Console.WriteLine("返回结果:{0}",result); 

            Thread.Sleep(2000);
            Console.Read(); 

        }

        private static void  Callback(IAsyncResult r)
        {

            Console.WriteLine("开始调用回调函数。。。");
            Console.WriteLine("回调函数此时的状态 :{0}",r.AsyncState);
            Console.WriteLine("调用此回调函数的线程是否在线程池 :{0}", Thread.CurrentThread.IsThreadPoolThread);
            Console.WriteLine("调用此回调函数的线程在线程池在的ID :{0}", Thread.CurrentThread.ManagedThreadId);
        }

        private static string RunThread(out int threadId)
        {
            Console.WriteLine("开始工作。。。");       

            Console.WriteLine("调用此回调函数的线程是否在线程池 :{0}", Thread.CurrentThread.IsThreadPoolThread);
            Thread.Sleep(TimeSpan.FromSeconds(2));
            threadId = Thread.CurrentThread.ManagedThreadId;
            return string.Format("此线程在线程池在的ID :{0}", threadId);
        }
    }
}

 

2.程序执行结果如下图。
 

       上面的程序运行时,我们首先创建线程来执行委托操作,然后调用委托的BeginInvoke来执行回调方法,这个回调函数会在异步操作完成之后会被调用,并且会把一个自定义的值传给这个回调函数,最后我们会得到一个实现了IAsyncResult接口的result对象,当线程池的工作线程在进行工作时,允许我们继续其他操作。我们可以轮询result对象的IsCompleted属性,确定操作是否完成。也可以调用EndInvoke将IAsyncResult传给委托参数。
二、     线程池中放入异步操作
 1.代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; 

namespace ThreadPoolDemo
{ 
    class Program
    {   

        static void Main(string[] args)
        {
            Console.WriteLine("开始测试线程池-QueueUserWorkItem。。。");
            const int x = 1;
            const int y = 2;
            string workState = "工作状态 2"; 

            ThreadPool.QueueUserWorkItem(AsyncOper);
            Thread.Sleep(1000);
            ThreadPool.QueueUserWorkItem(AsyncOper,"同步状态");
            Thread.Sleep(1000);

            ThreadPool.QueueUserWorkItem(status => {
                Console.WriteLine("操作状态 {0} ", status);
                Console.WriteLine("线程池中工作线程ID :{0}", Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(TimeSpan.FromSeconds(2));
            },"工作状态");
 

            ThreadPool.QueueUserWorkItem(_ => {
                Console.WriteLine("操作结果x+y= {0} ,{1}", x+y,workState);
                Console.WriteLine("线程池中工作线程ID :{0}", Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(TimeSpan.FromSeconds(2));
            }, "工作状态"); 

            Thread.Sleep(2000);
            Console.Read();
        }

        private static void  AsyncOper(object status)
        {
            Console.WriteLine("操作状态 :{0} ",status??"null");

            Console.WriteLine("工作线程在线程池在的ID :{0}", Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(2000);
        }  

    }
}

 

2.执行结果如下。程序执行了两次。

       程序首先定义了一个AsyncOper方法,然后使用QueueUserWorkItem将这个方法放入线程池中,然后再次放入一个AsyncOper方法,不过这次给方法调用传一个对象。
       代码中的调用Thread.sleep方法,是为了让线程池中的工作线程为新操作重用。请注意打印出来的ThradId,如果ThreadID一样则证明两个操作重用了同一个工作线程。
上一篇文章           查看所有文章
加:2017-11-08 23:22:25  更:2017-11-08 23:22:28 
 
  .NET新手区 最新文章
将ZIP文件添加到程序集资源文件然后在运行时
Web服务的调用
.NET创建WebService服务简单的例子
多线程编程学习笔记——任务并行库(三)
序列化和反序列化
Spring学习之路
4种解决json日期格式问题的办法
C#预处理器指令 ,你造吗??? (●'?&
查看C#的dll所依赖.Net版本
页面之间的传值,菜菜的
技术频道: 站长资讯 .NET新手区 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA Visual Studio ASP.NET MVC .NET控件开发 Entity Framework WinRT/Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动设计 Html/Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP Oracle ERP Dynamics CRM K2 BPM 信息安全 企业信息化其他 Android开发 iOS开发 Windows Phone Windows Mobile 其他手机开发 敏捷开发 项目与团队管理 软件工程其他 SQL Server Oracle MySQL NoSQL 其它数据库 Windows 7 Windows Server Linux
脚本语言: vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程
网站开发: CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 新闻资讯 小游戏 Chinese Culture 股票 三丰软件 开发 中国文化 网文精选 阅读网 看图 日历 万年历 2018年10日历
2018-10-19 9:38:30
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT知识库