zoukankan      html  css  js  c++  java
  • C#数据池

    //ThreadPool(线程池)是一个静态类,它没有定义任何的构造方法(),我们只能够使用它的静态方法,这是因为,这是因为ThreadPool是托管线程池(托管线程池http://msdn.microsoft.com/zh-cn/library/0ka9477y
    //ThreadPool使用WaitCallback委托,它所要做的工作是在后台进行的。使工作项的排队和运行更容易
    //ThreadPool 目标是为了减除线程的初始化开销,实现并行处理。

    //一个ThreadPool里面注册的线程拥有默认的堆栈大小,默认的优先级。并且,他们都存在于多线程空间(Multithreaded apartment)中。

    //ThreadPool 中的Thread不能手动取消,也不用手动开始。所以ThreadPool并不适用比较长的线程。你要做的只是把一个WaitCallback委托塞给 ThreadPool,然后剩下的工作将由系统自动完成。系统会在ThreadPool的线程队列中一一启动线程。

    //当线程池满时,多余的线程会在队列里排队,当线程池空闲时,系统自动掉入排队的线程,以保持系统利用率。

    //在以下情况中不宜使用ThreadPool而应该使用单独的Thread:
         //1,需要为线程指定详细的优先级
        //2,线程执行需要很长时间
        //3,需要把线程放在单独的线程apartment中
        //4,在线程执行中需要对线程操作,如打断,挂起等。


    //通常是将计算密集型的操作放在worker线程池中运行,而线程池的大小会根据当前的CPU使用量自动调整,通过下面两个方法,我们可以设置线程池的大小:
        //ThreadPool.SetMaxThreads(10, 200);
       //ThreadPool.SetMinThreads(2, 40);

    先看一个简单的例子(运行结果不会每次都一样,这应该是ThreadPool后台处理的正常反应)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    
    namespace HreadPool
    {
        class Program
        {
    
            static int j = 0;
            public static void Main(string[] args)
            {
                for (int i = 0; i < 2; i++)
                {
                    ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), i);
                }
                //new Timer(new TimerCallback(DoWork), (object)2, 0, 2000);
                Console.ReadLine();
            }
    
            //加入到线程池中的方法需是static类型,参数必须是object的类型,并且只能有一个参数,或者没有参数
            static void DoWork(object state)
            {
                j++;
                int treadNumber = (int)state;
                Console.WriteLine("线程{0}来报告了!", treadNumber);
                Console.WriteLine();
                Console.WriteLine(j);
            }
        }
    }
    

      接下来考虑如何用ThreadPool来调度一些周期性运行的工作,.NET提供了System.Threading.Timer类实现这一个功能。涉及Timer和TimerCallback。后者也是一个委托,其声明如下:
        public delegate void TimerCallback(object state);

    例如:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    
    namespace HreadPool
    {
        class Program
        {
    
            static int j = 0;
            public static void Main(string[] args)
            {
                new Timer(new TimerCallback(DoWork), (object)2, 0, 2000);
                Console.ReadLine();
            }
    
            //加入到线程池中的方法参数必须是object的类型,并且只能有一个参数,或者没有参数
            static void DoWork(object state)
            {
                j++;
                int treadNumber = (int)state;
                Console.WriteLine("线程{0}来报告了!", treadNumber);
                Console.WriteLine();
                Console.WriteLine(j);
            }
        }
    }
    

     

    new Timer(new TimerCallback(DoWork), (object)2, 0, 2000);(延迟时间为0,周期为2秒执行一次DoWork方法)
    后面的两个参数是启动的延迟时间和周期。
  • 相关阅读:
    element ui 权限 全选和半选
    div 内容垂直居中
    ajax 传递list2
    mysql学习03-sql执行加载顺序
    mysql学习02-mysql存储引擎(InnoDB,MyISAM)
    mysql学习01-mysql架构
    没有项目的源码,在eclipse下进行tomcat的远程调试,小计一下。
    win10系统,使用SangforHelperTool诊断工具进行修复时,无法安装虚拟网卡。
    postman在有登录认证的情况下进行接口测试!!!
    MongoDB4.0及以上的版本安装时无法启动服务。
  • 原文地址:https://www.cnblogs.com/xishuqingchun/p/3722152.html
Copyright © 2011-2022 走看看