使用静态对象时如何避免锁定
本文关键字:何避免 锁定 对象 静态 | 更新日期: 2023-09-27 17:57:26
我有一个C#桌面应用程序。
在我的代码中,我从相机中获取图像。我把这个图像传给一个程序。
这是我的代码的"语法":
//in a routine
if (!isProcessingMotion)
{
try
{
isProcessingMotion = true;
//do stuff
}
finally
{
isProcessingMotion = false;
}
}
//////
//module variable:
private static bool isProcessingMotion = false;
当从父代码引发事件时,将到达函数。
问题是'isProcessingMotion=false并不总是'hit'。我对整个代码进行了尝试捕获,但没有错误。
我不想使用监视器或锁("只读静态对象"),因为当我使用该应用程序时,进程会很慢。
我应该注意什么?
我认为发生的事情并不是没有到达finally块,而是在finally块执行后,另一个线程可能正在更改isProcessingMotion变量。当第二个事件被激发,但第一个事件尚未完成对第一个请求的处理时,可能会发生这种情况。
您的字段似乎同时有多个访问权限。虽然你不喜欢使用锁,但这似乎是解决你问题的完美方法。要么这样,要么就必须更改应用程序逻辑,以避免对同一变量进行多次读取。
编辑
既然你必须按顺序处理它们,我肯定会选择一个锁:
var processingLock = new object();
if (!isProcessingMotion)
{
lock (processingLock)
{
isProcessingMotion = true;
// Do stuff..
isProcessingMotion = false;
}
}