多线程
线程的建立与启动
void fun() {
// .. 执行耗时操作
}
var start = new ThreadStart(fun); // 创建线程入口
var thread = new Thread(start); // 创建线程
thread.Start();
线程的常用方法
方法 | 作用 |
---|---|
Start | 启动线程,分配给线程除了CPU之外的所有系统资源,并执行各种安全检查。调用后线程处于Unstarted状态 |
Join | 当前线程阻塞直到调用这个方法的线程执行完毕 |
Sleep | 休眠指定毫秒数,醒来后变为就绪态 |
Suspend | 阻塞线程 |
Resume | 恢复挂起的线程,进入就绪状态 |
Abort | 永久删除线程的数据 |
Thread类的常用属性
属性 | 作用 |
---|---|
CurrentThread | 获取当前正在运行的线程 |
Name | 线程名称 |
Priority | 线程调度优先级 (Highest, AboveNormal, Normal, BelowNormal, Lowest |
IsBackground | 设置后台线程 |
IsAlive | 线程如果启动且尚未正常终止,为true |
ThreadState | 指示当前线程的状态 |
给线程传递数据
public class Data {
public string Message;
}
public void fun(object o) {
// 做耗时的任务
}
var d = new Data { Message = "数据" }
new Thread(fun).Start(d);
public class MyThread {
private string data;
public MyThread(string data) {
this.data = data;
}
public fun() {
// ... 耗时
}
}
var myThread = new MyThread("info");
new Thread(myThread.fun).Start();
后台线程
- 默认情况下,Thread类创建的是前台线程,线程池的线程是后台线程
- 只有一个前台线程在运行,进程就在运行,后台线程不能独立于前台线程运行
- 后台线程适合完成后台任务,例如word的拼写检查器
- 通过IsBackground属性可以设置线程为后台线程或者前台线程,也可以获取线程是后台线程还是前台线程
线程池
线程池主要特点:
- 如果线程池线程始终保持繁忙,队列中包含挂起的工作,线程池会在一段时间后创建另一个辅助线程
- 每个进程有且仅有一个线程池,第一次将回调方法排入队列时才会创建线程池
- 最大线程数是可以配置的,工作数量大于最大线程数,新入队的工作就要排队
- 线程池通常用于服务器应用程序,可以来一个请求分配一个线程执行,不会占用主线程。
public void fun(object state) {
// ... 耗时
}
ThreadPool.GetMaxThreads(); // 获得最大线程数量
// 传入线程池中的回调方法是一个委托 public delegate void WaitCallBack(object state);
ThreadPool.QueueUserWorkItem(fun);
线程池限制</