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

时间:2014-04-07 16:43:17

标签: c# locking

我有一个C#桌面应用程序。

在我的代码中,我从相机中获取图像。我将此图像传递给例程。

这是'语法'我的代码:

//in a routine
if (!isProcessingMotion)
{
    try
    {
        isProcessingMotion = true;
        //do  stuff
    }
    finally
    {
        isProcessingMotion = false;
    }
}
//////

//module variable:
private static bool isProcessingMotion = false;

从父代码中引发事件时会到达该函数。

麻烦的是,'isProcessingMotion = false并不总是被击中'。我已经在整个代码周围放了一个try-catch,但是没有错误。

我不想使用监视器或锁定('只读静态对象'),因为当我执行应用程序时,研究进展缓慢。

我应该注意什么?

1 个答案:

答案 0 :(得分:0)

我认为发生的事情不是没有达到finally块,而是在执行finally块之后,不同的线程可能正在更改isProcessingMotion变量。当第二个事件被触发时,可能会发生这种情况,但第一个事件尚未完成处理第一个请求。

似乎您的字段有多个访问权限。 虽然你不想使用锁,但这似乎是解决问题的最佳方法。 或者你必须改变你的应用程序逻辑,不要对同一个变量进行多次读取。

修改

由于你必须按顺序处理它们,我肯定会使用锁:

        var processingLock = new object();
        if (!isProcessingMotion)
        {
            lock (processingLock)
            {
                isProcessingMotion = true;
                // Do stuff..

                isProcessingMotion = false;
            }
        }