我有一个 WritableBitmap,我想获得它的尺寸。因为该对象是由另一个线程拥有的,所以我们必须通过 Dispatcher。我试过这个:
int targetPixelWidth = 0;
int targetPixelHeight = 0;
writeableBitmap.Dispatcher.Invoke(new Action(() =>
{
targetPixelWidth = writeableBitmap.PixelWidth;
targetPixelHeight = writeableBitmap.PixelHeight;
}));
// Do something with targetPixelWidth and targetPixelHeight
但是,这有时会失败:即使实际值不同,这些值通常仍为 0。
认为这可能是线程问题,我将代码更改如下:
var bitmapInfo = (Tuple<int, int>)writeableBitmap.Dispatcher.Invoke(new Func<Tuple<int, int>>(
() => Tuple.Create(writeableBitmap.PixelWidth, writeableBitmap.PixelHeight)
));
Debug.Assert(bitmapInfo != null, "Obviously, this should pass.");
targetPixelWidth = bitmapInfo.Item1;
targetPixelHeight = bitmapInfo.Item2;
// Do something with targetPixelWidth and targetPixelHeight
但现在,bitmapInfo
有时为空。这很奇怪,因为(根据文档)Invoke
应该只在委托没有返回值时返回 null,这在这种情况下显然是这样做的。我什至已经Debug.Assert
编辑了 的返回值Tuple.Create
,它永远不会为空。
我在这里想念什么?是什么导致了这种竞争状况,我该怎么办?