命名空间 using System.Threading; using System.Threading.Tasks;
Thread(带参函数/不带参函数),delegate指针;Thread .tart(传参/不传参)调用;Thread .Join 函数意思是阻塞调用线程,直到某个线程终止时为止;Thread.CurrentThread.Abort();引发线程上的ThreadAborting异常,终止当前线程,除非你对abort函数非常了解,不然最好不要使用;Thread.ThreadState 判断指定线程状态 ;Thread.IsThreadPoolThread 是否是线程池中的线程.Thread.Priority 优先级;Thread.Suspend 挂起;
线程池:
1 线程池的线程不能设置名字(导致线程调试困难)。2 线程池的线程都是background线程3 阻塞一个线程池的线程,会导致延迟。4 可以随意设置线程池的优先级,在回到线程池时改线程就会被重置。5.每个线程还消耗(默认)约1 MB的内存,使用线程池创建线程的方法:Task/ThreadPool.QueueUserWorkItem/Asynchronous delegates/BackgroundWorker.
锁:
①加锁使多个线程同一时间只有一个线程可以调用该方法,其他线程被阻塞。同步对象的选择:使用引用类型,值类型加锁时会装箱,产生一个新的对象。使用private修饰,使用public时易产生死锁。(使用lock(this),lock(typeof(实例))时,该类也应该是private)。string不能作为锁对象。不能在lock中使用await关键字.private static object _locker = new object();lock (_locker)共享数据的操作 (Static Method),使用静态锁确保所有实例排队执行.private object _locker2=new object();lock(_locker2)共享数据的操作,非静态方法,是用非静态锁,确保同一个实例的方法调用者排队执行.lock其实是Monitors的简洁写法。②互斥锁(Mutex)互斥锁是一个互斥的同步对象,同一时间有且仅有一个线程可以获取它。可以实现进程级别上线程的同步。
子线程调用主线程:
定义代理:public delegate void SetValueHandler(string value);在子线程中:
if(this.textBox1.InvokeRequired){ // 在子线程中调用此方法时,通过Invoke转成主线程执行
//this.textBox1.Invoke(new SetValueHandler(updateUI), val); //方式一:通过代理创建的方法更新界面
this.Invoke(newEventHandler(delegate{ textBox1.Text += val; }));//方式二:使用匿名代理来更新界面return; }
使用BackgroundWorker类