这是我的例外
The calling thread cannot access this object because a different thread owns it.
我的函数从计算得到结果,我想更新已打开的窗口..
public override void UpdateResult(BaseMetricResults result)
{
var newResults = result as MetricUniformityResults;
if (newResults == null)
{
return;
}
DispatcherHelper.UIDispatcher.Invoke(() =>
{
TopToBottomGraph.CrossSectionPoints.Clear();
foreach (var point in newResults.TopToBottomGraph.CrossSectionPoints)
{
TopToBottomGraph.CrossSectionPoints.Add(point);
}
newResults.JetMap.Freeze(); //exception here
byte[] arr = new byte[(int) (newResults.JetMap.Width*newResults.JetMap.Height*3)];
newResults.JetMap.CopyPixels(arr, (int) (newResults.JetMap.Width*3), 0);
JetMap = BitmapSource.Create((int) newResults.JetMap.Width, (int) newResults.JetMap.Height, 96, 96,
PixelFormats.Rgb24, BitmapPalettes.WebPalette, arr,
(int) (newResults.JetMap.Width*3));
});
}
这是我的最后一次尝试,我不确定是否必须冻结bitmapsource ...
无论如何newResults.JetMap是BitmapSource,我有一个名为JetMap的属性,它是新的BitmapSource,如何用新的图像更新旧图像?
答案 0 :(得分:1)
您的DispatcherHelper.UIDispatcher.Invoke方法将在UI线程上执行。我最好的猜测是newResults.JetMap位图是在一个不同的线程上创建的,这阻止你修改它。同时,您无法创建要在UI线程以外的线程上显示的JetMap位图。因此,如果没有更多上下文,最好的建议是确保newResults.JetMap位图也在主UI线程中创建。
答案 1 :(得分:0)
你需要在创建它之后立即调用Jetmap.Freeze();
而不是在调度程序内部,一旦它被冻结你可以在调度程序中设置它并且你不会得到异常