我现在想知道如何从循环中包含的这段代码中避免这个错误。
var seriesColour = new LinearGradientBrush();
JSColor color = null;
seriesColour.Dispatcher.Invoke((System.Action)(() =>
{
seriesColour = _colourBrushes[field.SeriesColour];
color = new JSColor()
{
linearGradient = new JSGradient()
{
x1 = (int)seriesColour.StartPoint.X,
y1 = (int)seriesColour.StartPoint.Y,
x2 = (int)seriesColour.EndPoint.X,
y2 = (int)seriesColour.EndPoint.Y
},
stops = new object[]
{
new object[] { seriesColour.GradientStops[0].Offset, RGBConvert(seriesColour.GradientStops[0]) },
new object[] { seriesColour.GradientStops[1].Offset, RGBConvert(seriesColour.GradientStops[1]) }
}
};
}));
每当我刷新页面(第二次运行它)时,我似乎都会在标题中出现错误。有人有什么想法吗?
答案 0 :(得分:2)
使用Dispatcher
让SAME线程对所有内容进行操作的想法。因为您创建了seriesColour
,所以当您调用它ThreadA
时,它只是在Dispathcer.Invoke()
上调用它。
因此,如果您引用的其他组件之一是在ThreadA
上创建的,那么您将遇到问题。
正如@HansPassant建议的那样,试试ThreadB
。但是,我认为您还希望在Application.Current.Dispatcher.Invoke()
内创建seriesColour
。
答案 1 :(得分:1)
当您尝试从主线程以外的线程更新UI组件时,通常会发生此问题。
你的问题的原因似乎是seriesColour
组件是在不同的线程(不同于UI线程)中创建的,并且它的Dispatcher
对象可能没有调用UI线程(和尝试在UI中更新某些内容时遇到多线程问题。
使用seriesColour.Dispatcher.CheckAccess()
检查当前线程是否拥有seriesColour
组件。如果它拥有它,一切都很好。否则,使用以下命令在UI中完成工作:
this.Dispatcher.Invoke((Action)(() =>
{
seriesColour = _colourBrushes[field.SeriesColour];
...// your code here.
}));