DispatcherTimer в MVVM с Призмой? - PullRequest
       13

DispatcherTimer в MVVM с Призмой?

0 голосов
/ 01 ноября 2018

Я работаю над многоплатформенным приложением MVVM и хочу сохранить независимость от платформы ViewModel.

Мне нужно использовать DispatcherTimer или любой другой таймер. Поскольку DispatcherTimer не является частью .NET Standard / Core, мне было интересно, есть ли более эффективные альтернативы, чтобы я мог содержать виртуальную машину в чистоте от кода, специфичного для платформы (я хочу, чтобы он зависел только от .NET Core)?

Способ, которым это работает, заключается в том, что ViewModel реализует интерфейс, который предоставляет событие, которое прослушивает View, и отвечает на него соответствующим образом.
Таймер вызывает это событие при каждом тике.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Другой способ узнать DispatcherTimer - иногда мы можем использовать DispatcherTimer, чтобы сделать что-то поочередно.

Мы можем использовать Task.Delay для замены DispatcherTimer иногда.

Например, нам нужно запускать код А каждые 5 секунд.

   public async void Foo()
    {
        while (true)
        {
            // run a every 5 seconds
            await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(5));
            A();
        }
    }

    private void A()
    {

    }

А будет работать в главном потоке, если основной поток вызывает Foo, и я думаю, что вы Можно рассмотреть возможность использования этого метода в рамках.

0 голосов
/ 02 ноября 2018

Первый вариант - просто использовать классический Timer, который запускается в потоке без пользовательского интерфейса, а затем просто использовать Dispatcher вручную в режиме потребления. Это, однако, не так удобно.

Другой вариант - предоставить интерфейс, который могут реализовать пользователи вашей библиотеки, который будет иметь метод, подобный RunOnUiThread(Action action), и который вы просто будете использовать, чтобы убедиться, что специфичный для представления код выполняется в потоке пользовательского интерфейса.

Лучшим решением, вероятно, было бы получить вдохновение в самом Prism. Например, EventAggregator в библиотеке может публиковать события в потоке пользовательского интерфейса - сначала он захватывает контекст синхронизации текущего потока (см. здесь, на GitHub ):

var syncContext = SynchronizationContext.Current;

Это должно быть сделано, например, во время построения модели View в потоке пользовательского интерфейса. И затем вы можете вызвать действие в этом контексте синхронизации пользовательского интерфейса даже из другого потока (см. здесь, на GitHub ):

syncContext.Post((o) => action(), null);

Таким образом, вы можете просто использовать один из классов .NET Standard Timer и из их обратного вызова затем использовать SynchronizationContext для запуска действия в потоке пользовательского интерфейса.

...