Lock锁定一个引用对象,(不能锁定值类型,因为值类型传递的是拷贝,所以每次都是不同的值,没法lock)
lock(expression) statement_block
expression代表你希望跟踪的对象,通常是对象引用。
- 如果你想保护一个类的实例,一般地,你可以使用this;
- 如果你想保护一个静态变量(如互斥代码段在一个静态方法内部),一般使用类名就可以了。
而statement_block就是互斥段的代码,这段代码在一个时刻内只可能被一个线程执行。
Monitor类不仅可以完全取代lock语句,还可以使用TryEntry方法设置一个锁定超时,单位是毫秒。
ThreadPool: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应这一般使用ThreadPool(线程池)来解决;
另一种情况:线程平时都处于休眠状态,只是周期性地被唤醒
这一般使用Timer(定时器)来解决;
class Program
{
static void Main(string[] args)
{
int maxCount = 10;
Alpha alpha=new Alpha(10);
ManualResetEvent eventX = new ManualResetEvent(false);
alpha.xEvent = eventX;
for (int iItem = 1; iItem <= maxCount; iItem++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(alpha.Beta),new SomeState(iItem));
}
Console.WriteLine("Waiting for Thread Pool to drain");
eventX.WaitOne(Timeout.Infinite, true);
for (int i = 0; i < alpha.list.Count();i++ )
{
Console.WriteLine(alpha.list[i].ToString());
}
Console.ReadKey();
}
}
public class SomeState
{
public int Cookie;
public SomeState(int iCookie)
{
Cookie = iCookie;
}
}
public class Alpha
{
public ManualResetEvent xEvent;
public int iMaxCount = 0;
public int icount = 0;
public List<string> list = new List<string>();
public Alpha(int MaxCount)
{
iMaxCount = MaxCount;
}
public void Beta(Object State)
{
lock (list)
{
list.Add(icount.ToString());
Thread.Sleep(100);
}
Interlocked.Increment(ref icount);//InterLocked类也是专为多线程程序而存在的,它提供了一些有用的原子操作
if (icount == iMaxCount)
{
Console.WriteLine("Finished all events");
xEvent.Set();
}
}
}