创建线程的昂贵的操作,为每一个短暂的异步操作创建线程会产生显著的开销。所以需要使用Pooling技术。
线程池其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。 线程池非常适合大量小的运算。
通常是将计算密集型的操作放在worker线程池中运行,而线程池的大小会根据当前的CPU使用量自动调整,通过下面两个方法,我们可以设置线程池的大小:
ThreadPool.SetMaxThreads(10, 200);
ThreadPool.SetMinThreads(2, 40);
两个参数分别是WorkThread和IO thread的限制。
在C#中,线程同步是一种机制,用于控制多个线程访问共享资源的顺序,以避免数据竞争和不一致性问题。C#提供了多种线程同步技术,包括但不限于锁(lock)、监视器(Monitor)、信号量(Semaphore)、事件(EventWaitHandle、AutoResetEvent、ManualResetEvent)和互斥体(Mutex)。
AutoResetEvent
AutoResetEvent是.net线程简易同步方法中的一种。AutoResetEvent 常常被用来在两个线程之间进行信号发送
两个线程共享相同的AutoResetEvent对象,线程1可以通过调用AutoResetEvent对象的WaitOne()方法进入等待状态,然后另外一个线程2通过调用AutoResetEvent对象的Set()方法取消等待的状态。
AutoResetEvent如何工作的
在内存中保持着一个bool值,如果bool值为False,则使线程阻塞,反之,如果bool值为True,则使线程退出阻塞。当我们创建AutoResetEvent对象的实例时,我们在函数构造中传递默认的bool值,以下是实例化AutoResetEvent的例子。
WaitOne 方法
该方法阻止当前线程继续执行,并使线程进入等待状态以获取其他线程发送的信号。WaitOne将当前线程置于一个休眠的线程状态。WaitOne方法收到信号后将返回True,否则将返回False。
线程死锁通常发生在两个或更多的线程因为互相等待对方释放资源而无限期阻塞的情况。在C#中,死锁通常涉及到几种共享资源(例如锁、文件、数据库连接等)和线程之间的相互作用。造成线程死锁的原因主要包括以下几点:
假设有两个线程(线程A和线程B)以及两个资源(资源1和资源2)。线程A已经占有资源1,并且想要获取资源2。同时,线程B已经占有资源2,并且想要获取资源1。如果线程A和线程B都不释放它们各自已经占有的资源,那么它们都将无限期地等待对方,从而造成死锁。
在C#中,线程的生命周期是由多个状态组成的,这些状态包括线程的创建、启动、挂起、等待、恢复和终止。
线程的生命周期从创建开始。在C#中,可以通过System.Threading.Thread类的实例化来创建一个线程。创建线程时,需要指定一个将在该线程上执行的方法。
C#Thread myThread = new Thread(new ThreadStart(MyMethod));