我是一名新手,对C#、WPF和线程也不熟悉。 我正在使用MVC5开发Web应用程序。
我了解到,当在主线程以外的线程更新UI元素时,应该在调度程序上执行invoke操作。但是我并不完全了解需要进行的更改。
我有一个名为GetBitmapForDistributionChart的方法,它会进行UI更新,如下所示。
public byte[] GetBitmapForDistributionChart(int width, int height, DistributionChartParameters disrtibutionParams)
{
// delegate control instantiation to STA Thread
return DelegateBitmapGenerationToSTAThread(() =>
{
Chart canvasChart = new Chart(languageService);
canvasChart.Width = width;
canvasChart.Height = height;
canvasChart.Measure(new Size(width, height));
canvasChart.Arrange(new Rect(0, 0, width, height));
return GenerateBitmapFromControl(canvasChart, width, height);
});
}
DelegateBitmapGenerationToSTAThread的定义如下:
private byte[] DelegateBitmapGenerationToSTAThread(Func<byte[]> controlBitmapGenerator)
{
byte[] imageBinaryData = null;
Thread thread = new Thread(() =>
{
var renderer = new BitmapCreator(this.languageService);
imageBinaryData = controlBitmapGenerator();
});
//Set the thread to STA
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
//Wait for the thread to end
thread.Join();
return imageBinaryData;
}
当我在Chart类中添加以下行时,在canvasChart.Arrange处出现“无法使用属于不同线程的DependencyObject而不是其父Freezable”的异常:
rect.Fill = distributionParams.rangeData.ElementAt(i).barColor;
这段代码在主线程中执行。
如果我把同一行代码改成不依赖于右侧类的内容,那么它就能正常工作。
Like, rect.Fill = new SolidColorBrush(Colors.Red);
我不知道如何解决这个问题。
注意: 当尝试执行以下操作时,也会出现异常信息“调用线程无法访问此对象,因为该对象是另一个线程拥有的。”
rect.Fill = new SolidColorBrush(distributionParams.rangeData.ElementAt(i).barColor.Color);
distributionParams结构如下:
public struct DistributionParams
{
public struct RangeData
{
public string range;
public double distributionValue;
public SolidColorBrush barColor;
}
public List<RangeData> rangeData;
}
请帮我解决这个问题。
distributionParams.rangeData
时出现错误,这似乎与这两种方法没有任何关系...而且你也没有展示在主线程中如何准备distributionParams
。 - MBendervar d = new DistributionChartParameters.RangeData(); d = new DistributionChartParameters.RangeData(); d.range = "0-100"; d.distributionValue = 3; d.barColor = new SolidColorBrush(Colors.Blue); rangeData.Add(d);
列表上还有很多其他项目,但我只展示了一个。如果需要更多信息,请告诉我。 - vinmm