簡體   English   中英

鎖定C#:奇怪的行為

[英]lock in C# : weird behavior

我以大約30次/秒的速度從相機獲取圖像,並且在轉換圖像期間,我想防止相機釋放源圖像。

在此代碼中, bmp是源(相機獲取的圖像),而writeablebitmap是目標圖像(轉換后和顯示的圖像)

為此,我使用了lock

Messenger.Default.Register<Bitmap>(this, (bmp) =>
{
    ImageTarget.Dispatcher.BeginInvoke((Action)(() =>
    {
        if (ImageTarget.Source == null && bmp != null)
        {
            ImageTarget.Source = writeableBitmap;
        }

        Object tempLock = new Object();
        lock (tempLock)
        {
            Util.ImageConverter.Convert(bmp, writeableBitmap);
        }
     }));
});

這種方法似乎可行,但是它的性能確實很差(因為新的30次/秒)。 我在https://msdn.microsoft.com/zh-cn/library/c5kehkcz.aspx上看到可以使用tempLock的相同實例。

所以我的代碼部分變成:

Object tempLock = new Object();

Messenger.Default.Register<Bitmap>(this, (bmp) =>
{
    ImageTarget.Dispatcher.BeginInvoke((Action)(() =>
    {
        if (ImageTarget.Source == null && bmp != null)
        {
            ImageTarget.Source = writeableBitmap;
        }


        lock (tempLock)
        {
            Util.ImageConverter.Convert(bmp, writeableBitmap);
        }
     }));
});

問題在於writeableBitmap始終為黑色。

為什么我做得不好?

謝謝

編輯:我找到了一個解決方案,我把Object tempLock = new Object(); 在構造函數之外(直接在類中工作,但是我不知道為什么)

當您放置Object tempLock = new Object(); 在構造函數之外,您只能在主線程中初始化一次。 但是,當您將其放入ImageTarget.Dispatcher.BeginInvoke()您正在在后台線程上對其進行初始化。 因此,tempLock的值在主線程上保持為空,並且不可能鎖定為空值。

暫無
暫無

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

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