线程 基础
- CPU: 时间轮询机制(纳秒级),执行线程调度(注意CPU寄存器一出一进的时间开销不可大于CPU阻塞时间)
- GUI:消息轮询机制,UI线程不支持跨线程访问,可以通过 Invoke/BackgroundWorker/SynchronizationContext
- 进程 = 主线程 + 0 或 多个子线程
- 线程状态: 就绪/阻塞/运行
- 线程池:以减少创建和销毁线程为目的,系统自动维护和调度线程,用户是不可控制的。如果需要等待线程池完成所有任务,可以通过 ManualResetEvent 设置信号状态控制。
- UI线程: CheckForIllegalCrossThreadCalls 默认为true. 如果试图访问控件的方法或属性之一的线程不是创建该控件的线程,则通常会导致不可预知的结果.
- 多线程方法重入: 注意共享资源问题, 通常以加锁 lock/Monitor 来解决.
- 前台后台线程区别: 设置为前台的所有子线程不会随着主线程的结束而结束, 而设置为后台的所有子线程则会随着主线程的结束而结束.
1. 默认创建的线程都是为前台线程: IsBackground=false
-
System.Threading.AutoResetEvent wait = new System.Threading.AutoResetEvent(false);
wait.WaitOne();//等待,当收到Set信号则继续执行并自动设置Reset信号,而ManualResetEvent的wait则不会自动设置
wait.Set();//让等待的地方继续执行
当然这两个方法要写在不同的线程里面,如果写在一个线程里面 wait.Set(); 是没机会执行的 - 异步线程:IAsyncResult