繁体   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