Я новичок в C#, WPF & Threading тоже. Я работаю над веб-приложением с MVC5.Получение исключения при вызове обновлений пользовательского интерфейса
Я узнал, что должен активировать диспетчер при обновлении элементов пользовательского интерфейса в потоке, отличном от основного потока. Но я точно не знаю, какие изменения мне нужно делать.
У меня есть метод 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;
}
я получаю исключение «Не удается использовать DependencyObject, который принадлежит другому потоку, чем его родитель Freezable.» на холстеChart.Arrange, когда я добавлю следующую строку в класс диаграмм:
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;
}
Пожалуйста, помогите мне решить эту проблему.
Я чувствую, что код, который вы предоставили, не складывается. Вы показываете два метода, которые используют mutlithreading, а затем появляется ошибка при использовании 'distributionParams.rangeData', которая, похоже, не имеет никакого отношения к этим двум методам ... Также вы не показали, как' distributionParams' подготовлен в основной поток. – Shaamaan
@ Шхамаан: Извините за недостающие вещи. Я создаю объект Chart и звоню. Таким образом, во время аранжировки это исключает. distributionParams подготовлен следующим образом: var d = new DistributionChartParameters.RangeData(); d = new DistributionChartParameters.RangeData(); d.range = "0-100"; d.distributionValue = 3; d.barColor = новый SolidColorBrush (Colors.Blue); rangeData.Add (d); В списке много других. Но я показываю только 1 пункт. Пожалуйста, дайте мне знать, что вам нужна дополнительная информация об этом. – vinmm