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
は時々nullです。(ドキュメントによると)デリゲートに戻り値がない場合にのみ null を返す必要があるため、これは奇妙Invoke
です。この場合は明らかにそうです。Debug.Assert
の戻り値も編集しましたがTuple.Create
、null になることはありませんでした。
ここで何が欠けていますか?この競合状態の原因は何ですか?どうすればよいですか?