簡體   English   中英

使用靜態對象時如何避免鎖定

[英]How to avoid locking when using a static object

我有一個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;
            }
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM