C#线程间通讯时可能会造成两个线程同时对一个变量进行操作的二值化问题,除了lock互斥锁以外还可以用AutoResetEvent来进行操作
首先声明
private AutoResetEvent threadOne = new AutoResetEvent(false);
让初始状态下为终止状态
然后在线程1中你的代码块运行末尾添加
threadOne.Set();
在线程2中添加
threadOne.WaitOne();
在线程1每次没有运行到Set()时,线程2WaitOne()以下的代码块不会被执行,会一直等待线程1向他发送信号,只有接收到信号后才能执行之后的代码块
而且AutoResetEvent是一个自动的信号量当你执行完一次Set()和WaitOne()方法后他又会自动将信号置成你设定的初始状态(false)不用每次手动操作置位
这样就可以避免一些简单的线程堵塞和二值化情况