想象一下这种情况,当Windows窗体上有一个按钮,它读取一个名为x的变量的值。同时,有一个线程会偶尔运行(使用一个计时器),清除该变量并将新数据放入其中:
//this function runs by a thread
void newData()
{
manualReset.WaitOne();
//clear x
//put new data in it
}
private void btRead_Click(object sender, EventArgs e)
{
manualReset.Reset();
//read x
ManualReset.Set();
}
现在,如果我在线程执行行" waitOne()"时单击该按钮,则重置此次不会产生任何效果,因为" waitOne"已经通过,线程将清除数据,而我试图在主UI线程中读取它。那么解决方案是什么?提前致谢
答案 0 :(得分:3)
使用lock声明:
lock关键字确保一个线程不会输入关键字 代码段,而另一个线程在临界区。如果 另一个线程试图输入一个锁定的代码,它会等待,阻止, 直到对象被释放。
private Object objLockVar = new Object();
void newData()
{
// ...code...
lock (objLockVar)
{
//clear x
//put new data in it
// other code considered part of the "atomic" operation
}
// ...more code...
}
private void btRead_Click(object sender, EventArgs e)
{
lock (objLockVar)
{
// read x
}
// ...more code...
}