想象一下,当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线程中读取数据时,该线程将清除数据。那么解决办法是什么呢?提前感谢
发布于 2017-01-20 13:58:49
使用锁定语句:
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...
}https://stackoverflow.com/questions/41765139
复制相似问题