线 程 池 与 定 时 器 线程池与定时器 线程池与定时器
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()