C#线程

  • 线程Thread:
    •  创建:var t1=new Thread(()=>{…}); var t2=new Thread((object obj)=>{…});
    •  启动:t.Start();
    •  暂停:Thread.Sleep(TimeSpan.FromSeconds(2));
    • 等待线程执行完再执行主线程:t.Join(); 
    • 终止线程:t.Abort(); 
    • 获取线程状态:t.ThreadState或Thread.CurrentThread.ThreadState; 
    • 线程优先级:t.Priority; 
    • 后台线程(前台线程结束后立即结束):t.IsBackground = true; 
    • 线程传参(3种方式):1、var obj=new X(n);new Thread(obj.Count); 2、t.Start(n); 3、new Thread(()=>Count(n)); 
    • 主线程无法捕获子线程中的异常。
  • 委托线程:例:var act=new Action<object>(Method); IAsyncResult result = act.BeginInvoke(“Thread Param”, CallBack, “Callback Param”); var rr = act.EndInvoke(result);
  • 线程池:由于线程的创建和销毁比较耗费资源,所以为了重用线程,需要放入线程池。线程池里的线程默认为后台线程。ThreadPool.QueueUserWorkItem(Method, parm)表示把线程Method放入池中,pram为线程参数。
  • Task类:能传参和返回值的线程。Task<TResult>(Method, parm),TResult表示线程结束后返回的值类型。Task cwt=t.ContinueWith(task=>{});表示t完成后启动另一个新线程。
  • 线程同步:多个线程共享对象时,会产生使用竞争,需要线程同步。
    • 解决方法:只使用最小的原子操作、加锁、给信号。
    • Interlocked:提供了Increment()、Decrement()和Add等数学操作的原子方法。
    • 加锁:lock(obj){},obj最好为私有对象。
    • Monitor锁:通过Monitor.Enter()和Monitor.Exit()实现排它锁的获取和释放。Monitor.TryEnter(obj, TimeSpan.FromSeconds(10)) 请求不到资源时不会阻塞,可以设置超时时间,获取不到返回false。
    • SemaphoreSlim:用户模式,构造函数提供允许的并发线程数目。实例作为线程共享对象。s.Wait()表示等待获取执行权,获取后执行后面代码;s.Release()表示释放执行权。
    • AutoResetEvent:内核模式,实例作为线程共享对象。a.WaitOne()表示等待获取执行权,获取后执行后面代码;a.Set()表示释放执行权。
    • ManualResetEventSlim:实例作为线程共享对象。m.Wait()表示等待获取执行权,获取后执行后面代码;m.Set()表示释放执行权。m.Reset()收回执行权。
    • CountdownEvent:构造函数指定需发送的信号数。C.Wait()表示等待所有信号发送完毕;c.Signal()表示发送一个信号;c.Dispose()表示释放此对象。
    • Barrier:构造函数指定线程数和所有线程都执行一遍后的回调函数。B.SignalAndWait()表示发送一个信号并等待。
    • ReaderWriterlockSlim:读操作锁为共享锁,多个线程可以并发读取资源,而写操作为独占锁,只允许一个线程操作。r.EnterReadLock()表示开始进入读取数据锁;r.ExitReadLock()表示退出读取锁;r.EnterUpgradeableReadLock()表示进入可能修改数据的读取锁;r.ExitUpgradeableReadLock()表示退出可能修改数据的读取锁;r.EnterWriteLock()表示进入写数据锁;r.ExitWriteLock()表示退出写数据锁。获取写锁后数据会处于阻塞状态。
posted @ 2018-12-26 18:30  云飞燕  阅读(153)  评论(0)    收藏  举报