在多线程编程中,最常用到的就是线程同步问题,前段时间开发地址采集服务器,需要携带经纬度到MapAbc中采集后,返回地址,才可以进行下一条经纬度的采集,因为队列处理和解析不是同一个线程,并且是解析经纬度是异步的操作,所以就涉及到线程同步问题,所以针对这个对ManualResetEvent和AutoResetEvent两个信号量巩固练习一下。
class Program
{
static ManualResetEvent _ManualResetEvent = new ManualResetEvent(false);
static void Main(string[] args)
{
int i = ;
Thread _Thread = new Thread(TestFun);
_Thread.Start(); _ManualResetEvent.Set();
//Thread.Sleep(100);
Console.WriteLine("test1");
Console.ReadLine();
} static void TestFun()
{
while (true)
{
_ManualResetEvent.WaitOne();
Console.WriteLine("test");
Thread.Sleep();
}
}
}
当是手动时,信号量为打开状态,会一直打印test
class Program
{
static ManualResetEvent _ManualResetEvent = new ManualResetEvent(false);
static void Main(string[] args)
{
int i = ;
Thread _Thread = new Thread(TestFun);
_Thread.Start(); _ManualResetEvent.Set();
//Thread.Sleep(100);
Console.WriteLine("test1");
Console.ReadLine();
} static void TestFun()
{
while (true)
{
_ManualResetEvent.WaitOne();
Console.WriteLine("test");
Thread.Sleep();
_ManualResetEvent.Reset();
}
}
}
当把信号量重置后,就不会继续打印test了
如果使用AutoResetEvent的话
class Program
{
static AutoResetEvent _AutoResetEvent = new AutoResetEvent(false);
static void Main(string[] args)
{
int i = ;
Thread _Thread = new Thread(TestFun);
_Thread.Start(); _AutoResetEvent.Set();
//Thread.Sleep(100);
Console.WriteLine("test1");
Console.ReadLine();
} static void TestFun()
{
while (true)
{
_AutoResetEvent.WaitOne();
Console.WriteLine("test"); }
}
}
其实跟ManualResetEvent一个原理,只是Set之后,只执行一次,需要重新再Set,WaitOne处才会继续执行下去