锁定 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/en-us/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();
放在构造函数之外(直接放在 class 中并且它起作用了,但我不知道为什么)
当您将 Object tempLock = new Object();
放在构造函数之外时,您只在主线程中初始化它一次。但是,当您将它放在 ImageTarget.Dispatcher.BeginInvoke()
中时,您是在后台线程上对其进行初始化。所以 tempLock 的值在主线程上保持为 null,并且不可能锁定 null 值。
我以大约 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/en-us/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();
放在构造函数之外(直接放在 class 中并且它起作用了,但我不知道为什么)
当您将 Object tempLock = new Object();
放在构造函数之外时,您只在主线程中初始化它一次。但是,当您将它放在 ImageTarget.Dispatcher.BeginInvoke()
中时,您是在后台线程上对其进行初始化。所以 tempLock 的值在主线程上保持为 null,并且不可能锁定 null 值。