Первый вариант - просто использовать классический Timer
, который запускается в потоке без пользовательского интерфейса, а затем просто использовать Dispatcher
вручную в режиме потребления. Это, однако, не так удобно.
Другой вариант - предоставить интерфейс, который могут реализовать пользователи вашей библиотеки, который будет иметь метод, подобный RunOnUiThread(Action action)
, и который вы просто будете использовать, чтобы убедиться, что специфичный для представления код выполняется в потоке пользовательского интерфейса.
Лучшим решением, вероятно, было бы получить вдохновение в самом Prism
. Например, EventAggregator
в библиотеке может публиковать события в потоке пользовательского интерфейса - сначала он захватывает контекст синхронизации текущего потока (см. здесь, на GitHub ):
var syncContext = SynchronizationContext.Current;
Это должно быть сделано, например, во время построения модели View в потоке пользовательского интерфейса. И затем вы можете вызвать действие в этом контексте синхронизации пользовательского интерфейса даже из другого потока (см. здесь, на GitHub ):
syncContext.Post((o) => action(), null);
Таким образом, вы можете просто использовать один из классов .NET Standard Timer и из их обратного вызова затем использовать SynchronizationContext
для запуска действия в потоке пользовательского интерфейса.