C#多线程同步之AutoResetEvent
AutoResetEvent用于线程间的同步
,其构造函数,用一个指示是否将初始状态设置为终止的布尔值初始化该类的新实例。
- false:无信号,子线程的WaitOne方法不会被自动调用
- true:有信号,子线程的WaitOne方法会被自动调用
public static AutoResetEvent Work1ResetEvent = new AutoResetEvent(false);
public static AutoResetEvent Work2ResetEvent = new AutoResetEvent(false);
代码实例
Work1 运行中需要等待Work2 执行完毕之后再运行接下来的操作!
public class Work1
{
public void DoIt()
{
while (true)
{
Console.WriteLine($"{Thread.CurrentThread.Name} 开始运行....");
Thread.Sleep(1000);
Console.WriteLine($"{Thread.CurrentThread.Name} 第一步执行完毕激活work2....");
Setting.Work2ResetEvent.Set();
Console.WriteLine($"{Thread.CurrentThread.Name} 继续运行....");
Thread.Sleep(5000);
// wait
Setting.Work1ResetEvent.WaitOne();
Console.WriteLine($"{Thread.CurrentThread.Name} 运行完成....");
Setting.Work1ResetEvent.Reset();
Console.WriteLine("整体流程完毕!!");
Console.WriteLine("-------------------------------------------");
Console.WriteLine();
}
}
}
public class Work2
{
public void DoIt()
{
while (true)
{
// 等待 work1
Setting.Work2ResetEvent.WaitOne();
Console.WriteLine($"{Thread.CurrentThread.Name} 开始运行....");
Thread.Sleep(1000);
Console.WriteLine($"{Thread.CurrentThread.Name} 运行完成启动Work1....");
Setting.Work2ResetEvent.Reset();
// 激活work1
Setting.Work1ResetEvent.Set();
}
}
}
public class Setting
{
public static AutoResetEvent Work1ResetEvent = new AutoResetEvent(false);
public static AutoResetEvent Work2ResetEvent = new AutoResetEvent(false);
}
调用
class Program
{
static void Main(string[] args)
{
Thread t1 = new Thread(new Work1().DoIt);
t1.Name = "work1";
t1.Start();
Thread t2 = new Thread(new Work2().DoIt);
t2.Name = "Work2";
t2.Start();
Console.ReadKey();
}
}
运行结果