Как реализовать многократно вызванный асинхронный рендеринг данных?

Помогите, пожалуйста.

Суть вопроса: пытаюсь рисовать карту асинхронно, если все происходит, как и задумано - карта отображается первый раз, я меняю данные (например, кручу колесиком и меняю зум) - стартует перерисовка в отдельном таске - по завершению UI-поток забирает картинку и отображает. Проблемы начинаются в нестандартных ситуациях, например, если я меняю зум, стартует таск, начинает перерисовывать, я еще раз меняю зум (предыдущая перерисовка еще не завершилась) и в итоге получается непонятно что.

Изначально я не думал о многопочности, поэтому архитектура такая: есть несколько слоев, в каждом свой класс, отвечающий за рендеринг(разные по типу слоя), в каждом рендеринг-классе свой контекст, который, собственно, и аккумулирует результат рендеринга, то есть рисуется в него. Контекст не зависит от потока, то есть один и тот же. При обновлении картинка внутри контекста чистится, а затем снова создается.

Пытался использоваться CancellationToken, но он же не гарантирует завершение предыдущего таска, можно только объявить места, в которых таск может прекратить выполнение, то есть - первый таск выполняется, делаю CancellationToken.Cancel(), тут же создаю второй таск - он чистит данные контекста, а данные то еще могут понадобится, потому как первый таск не завершился.

Не знаю, как правильно со всем этим разобраться, может, логику переделать (честно говоря, даже не знаю, как), либо есть способ синхронизировать эти таски.
Заранее спасибо.
  • Вопрос задан
  • 2525 просмотров
Решения вопроса 1
lam0x86
@lam0x86
Контекст не зависит от потока, то есть один и тот же.

Вот тут, как мне кажется, вся проблема.
Я бы сделал как-то так: при необходимости отрендерить новый кадр, создается таск, внутри которого создается контекст, и затем этот контекст прогоняется через все рендереры, каждый из которых дорисовывает нужный слой. Результат отдаётся GUI Dispatcher'у.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы