使用静态对象时如何避免锁定

本文关键字:何避免 锁定 对象 静态 | 更新日期: 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;
            }
        }