У меня есть WritableBitmap, и я хочу получить его размеры. Поскольку объект принадлежит другому потоку, мы должны пройти Диспетчер. Я попытался это:Состояние гонки с Dispatcher.Invoke
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
ed возвращаемое значение Tuple.Create
, и оно никогда не было нулевым.
Что мне здесь не хватает? Что вызывает это состояние гонки, и что я могу с этим поделать?
try() => вернуть новый Tuple.Create (writeableBitmap.PixelWidth, writeableBitmap.PixelHeight); – makc
Я сделал; к сожалению, не изменилось. – jqno
Вы пытались помещать Debug.Assert или регистрироваться внутри выражения lambda? – makc