调用线程无法访问此对象,因为另一个线程拥有它错误

时间:2014-01-15 12:04:24

标签: c# multithreading

我现在想知道如何从循环中包含的这段代码中避免这个错误。

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]) }
        }
    };
}));

每当我刷新页面(第二次运行它)时,我似乎都会在标题中出现错误。有人有什么想法吗?

2 个答案:

答案 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.
}));