线 程 池 与 定 时 器 线程池与定时器 线程池与定时器

1.线程池 ThreadPool

线程池:Thread Pool
一个池子,里面有多个备用线程。当需要执行任务时,从中取一个线程并执行。
类似于JDBC里的数据库连接池技术。


1创建一个短任务

public static void SimpleJob(object state){
}

2将任务(委托)递交给

ThreadPoolThreadPool.QueueUserWorkItem(
new WaitCallback(SimpleJob)
);

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
using Major;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace CSharp基础语法
{


    class Program
    {
        public static void SimpleJob(object state)
        {
            for(int i = 0; i < 3; i++)
            {
                Console.WriteLine(i + 1);
                Thread.Sleep(1000);
            }
            Console.WriteLine("任务结束");
        }

        static void Main(string[] args)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(SimpleJob)); // 后台线程,很弱,需要下面加Console.ReadLine();
            Console.ReadLine();
            Console.WriteLine("Main退出");

        }
    }
}

;

线程池与定时器_基础语法

执行规则:
1线程池如果空闲,则取出线程来执行这个任务
2线程池如果忙碌,则会排到队列等待执行

ThreadPoo1.SetMaxThreads()可以设置其容量

ThreadPool 和Thread对比:
1 ThreadPool:适合较短小的任务
Thread:任务长任务

2 ThreadPool:后台线程
Thread: 默认为前台线程

3 ThreadPool:自动管理,无法控制
Thread:手动管理,可以灵活控制


ThreadPol 里的线程为后台线程
当进程退出时,正在执行的任务会被中断


2.定时器 Timer

定时器:Timer ,用于定时执行一个任务
在.NET框架API里有4个Timer类:

System.Timers.Timer
System.Threading.Timer
System.Windows.Forms.Timer
System.Web.UI.Timer

定时器System.Threading.Timler

1创建并启动定时器

new Timer(callback, state, dueTime, period)

其中,
callback :任务回调
state:任务参数
dueTime:首次执行的时间延迟
period :周期运行的时间间隔

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
using Major;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace CSharp基础语法
{


    class Program
    {
        public static void SimpleJob(object state)
        {
            for (int i = 0; i < 3; i++)
            {
                Console.WriteLine(i + 1);
                Thread.Sleep(1000);
            }
            Console.WriteLine("任务结束");
        }

        static void Main(string[] args)
        {
            Timer timer = new Timer(new TimerCallback(SimpleJob)
                , null
                ,10000
                ,1000
                );
            Console.ReadLine();
            Console.WriteLine("Exit");
        }
    }
}

;

dueTime :

0,立即开始执行
n , n毫秒之后执行
Timeout.Infinite禁用

period :

0,禁用
n , n毫秒周期间隔
Timeout.Infinite,禁用

注:间隔如果小于系统时间精度,则无意义(15ms左右)


1定时器的精度限制,最小15ms左右,再小没有意义

2实际使用的是ThreadPool来执行的任务

3任务的叠加:如果一个任务执行时间太长,可能造成任务的叠加。每个任务是在不同的线程中运行的。Callback设计要求:可重入、可叠加

4定义器含有非托管资源,用完后需要手工Dispose()