Наиболее подходящий ответ здесь, вероятно, - выставить event
где-нибудь на вашем бизнес-уровне. Ваш код пользовательского интерфейса может подписаться на событие и обрабатывать событие, переключаясь на поток пользовательского интерфейса (при необходимости) и обновляя себя.
Тогда бизнес-коду не нужно знать о пользовательском интерфейсе, и он может работать так же без любого пользовательского интерфейса (но, как и для всех делегатов / обратных вызовов, вам нужно проверить на null
перед попыткой для вызова делегата).