10二线程编制程序学习笔记

 

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);        }      }} 

图片 1

专注:放入线程池中的操作须要的年月要短,不要把必要长日子运作的操作放入线程池中,或不通工作线程。那将招致质量难题和极度难以调用的题材。

    
.NET中的线程池是受CLCRUISER管理的,TheadTool类有贰个QueueUserWorkItem静态方法,那一个静态方法接受3个委托,代表用户自定义的多个异步操作,在这几个措施被调用之后,委托会进入到里头队列中,如果池中从不线程,则创造1个办事线程,把首个委托放入工作线程。假如继续放入委托,则池创制新的干活线程,直到工作线程数量达到上限。那时再放入委托,则不会创立新的做事线程,而是在队列中等候,直到有闲暇的办事线程。

1、 线程池中调用委托

      
注意:放入线程池中的操作必要的小运要短,不要把需求长日子运作的操作放入线程池中,或不通工作线程。那将促成品质难点和丰裕难以调用的难点。

次第首先定义了四个AsyncOper方法,然后利用QueueUserWorkItem将这几个方法放入线程池中,然后重新放入3个AsyncOper方法,可是这一次给艺术调用传多个对象。

     
要是你有那一个多的施行时间非常短的操作,那么适协效率线程池来进步功效,而不是自动创造八线程。

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

      
代码中的调用Thread.sleep方法,是为着让线程池中的工作线程为新操作重用。请小心打字与印刷出来的ThradId,若是ThreadID一样则注脚八个操作重用了同3个工作线程。

二、 线程池中放入异步操作

  接上文 二10八线程编制程序学习笔记——线程同步(三)

一.代码之类:

2、     线程池中放入异步操作

在ASP.NET中使用线程池要防患于未然,ASP.NET中的线程池是三个共用线程池,要是线程池中的工作线程都用完了,则会导致WEB服务器对平常的HTTP请求无法提供服务。

 

接上文 八线程编制程序学习笔记——线程同步

 一.代码之类:

.NET中的线程池是受CL卡宴管理的,TheadTool类有3个QueueUserWorkItem静态方法,这一个静态方法接受3个信托,代表用户自定义的3个异步操作,在这一个艺术被调用之后,委托会进入到里面队列中,假如池中尚有线程,则开创2个做事线程,把第贰个委托放入工作线程。假诺一而再放入委托,则池创制新的工作线程,直到工作线程数量达到上限。那时再放入委托,则不会创立新的行事线程,而是在队列中等候,直到有闲暇的办事线程。

      
下边包车型大巴程序运营时,我们第3成立线程来推行委托操作,然后调用委托的BeginInvoke来执行回调方法,那么些回调函数会在异步操作完毕之后会被调用,并且会把三个自定义的值传给那些回调函数,最后咱们会博得几个达成了IAsyncResult接口的result对象,当线程池的工作线程在开始展览工作时,允许大家继承别的操作。大家能够轮询result对象的IsCompleted属性,明确操作是还是不是做到。也能够调用EndInvoke将IAsyncResult传给委托参数。

图片 2

 

图片 3

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);
        }
    }
}

要是你有那些多的实践时间相当短的操作,那么适合营用线程池来升高功效,而不是自动创设四线程。

      
当线程池中兼有操作都成功,而且尚未新职分操作时,线程池会释放长日子不用的财富。

接上文 10二线程编制程序学习笔记——线程同步

二.实践结果如下。程序执行了三次。

二.履行结果如下。程序执行了三次。

 一.代码之类:

接上文102线程编程学习笔记——线程同步

 接上文 10贰线程编制程序学习笔记——线程同步(壹)

1.代码之类:

 

当线程池中负有操作都形成,而且尚未新任务操作时,线程池会释放长日子不用的资源。

 接上文 二十二十四线程编制程序学习笔记——线程同步(二)

上边的程序运转时,大家首先创设线程来进行委托操作,然后调用委托的BeginInvoke来推行回调方法,那个回调函数会在异步操作完结之后会被调用,并且会把3个自定义的值传给那个回调函数,最终大家会获得多少个兑现了IAsyncResult接口的result对象,当线程池的工作线程在进行工作时,允许大家后续其余操作。我们得以轮询result对象的IsCompleted属性,鲜明操作是不是到位。也能够调用EndInvoke将IAsyncResult传给委托参数。

 

创办10二线程操作是可怜高昂的,所以各种运转时刻尤其短的操作,成立八线程实行操作,大概并不能够升高作用,反而下落了频率。

                
在ASP.NET中使用线程池要小心,ASP.NET中的线程池是1个共用线程池,假若线程池中的工作线程都用完了,则会导致WEB服务器对健康的HTTP请求无法提供服务。

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);        }    }} 

      
程序首先定义了二个AsyncOper方法,然后使用QueueUserWorkItem将那些点子放入线程池中,然后再度放入3个AsyncOper方法,但是此番给艺术调用传三个目的。

线程池,正是大家先分配一些财富到池塘里,当大家需要接纳时,则从池塘中收获,用完了,再放回池子里。

 

代码中的调用Thread.sleep方法,是为着让线程池中的工作线程为新操作重用。请留意打字与印刷出来的ThradId,若是ThreadID1样则印证五个操作重用了同叁个工作线程。

     
成立多线程操作是丰富昂贵的,所以每一个运营时刻越来越短的操作,创建二10四线程进行操作,可能并无法升高成效,反而降低了频率。

 图片 4

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);
        }  

    }
}

     
线程池,便是大家先分配一些能源到池塘里,当大家供给使用时,则从池塘中拿走,用完了,再放回池子里。

1、     线程池中调用委托

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