[英]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.