Проблема с производительностью при экспорте нескольких моделей оксиплотов в виде png - PullRequest
1 голос
/ 20 марта 2019

Сводка

Когда существует несколько диаграмм, которые необходимо экспортировать в файл в формате PNG, возникает проблема производительности с памятью и блокируется пользовательский интерфейс до тех пор, пока все диаграммы не будут сохранены.

Документация гласит следующее:

Предупреждение: частый вызов метода ExportToBitmap за очень короткий период может привести к высокому использованию памяти.

Проблема в том, что ExportToFile также вызывает ExportToBitmap и это является источником проблемы с памятью.

При попытке запустить это в фоновом потоке или с помощью Parallel.ForEach приложение завершится сбоем со следующим сообщением

Вызывающий поток должен быть STAпотому что это требуется для многих компонентов пользовательского интерфейса.

Вопрос

Как повысить производительность ExportToFile при многократном вызове из цикла for?

1 Ответ

0 голосов
/ 20 марта 2019

Решение

Если существует List из PlotModel объектов, которые должны быть экспортированы в файловую систему, создайте Task для каждой модели графика. Проблема возникает с ExportToBitmap, который требует запуска в потоке пользовательского интерфейса. Для решения этой проблемы создайте scheduler и запустите задание, используя его.

Пример

var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
foreach(var model in models) { // models is list of PlotModel objects
    var task = new Task(() => {
        var pngExporter = new PngExporter {
            Width = 1200,
            Height = 742,
            Background = OxyColors.White
        };
        pngExporter.ExportToFile(model, path); // define your own path
    });
    task.Start(scheduler);
}
...