DispatcherTimer работает в вашем потоке пользовательского интерфейса, поэтому во время его проверки ваш пользовательский интерфейс, вероятно, зависнет, пока работает сообщение DispatcherTimer_Tick .Если для DispatcherTimer_Tick требуется 2 секунды, то каждые 3 секунды пользователь останавливает интерфейс на 2 секунды.Это не понравится пользователям.
Все сервисные вызовы должны выполняться в потоке, не связанном с пользовательским интерфейсом, чтобы не блокировать пользовательский интерфейс, поэтому я бы предложил использовать таймер и сделать что-то вроде этого:
public MainViewModel()
{
_stTimer = new System.Threading.Timer(Timer_Tick,null,3000,3000);
_dispatcher = Dispatcher.CurrentDispatcher;
}
private void Timer_Tick(object sender)
{
Account.Ping = _service.Ping(Account);
//Refresh data in dictionary
_freshUsers = _service.LoadUsers(Account);
_users.Clear();
SelectedUsersIndex = 1;
foreach (var freshUser in _freshUsers)
{
_users.Add(freshUser);
}
for(int i=0;i<Account.Ping.Rp; i++)
{
//check if you have new messanges
if (Account.Ping.Rp > 0)
{
Rp message = _service.LoadRp(Account);
_messages.Add(message);
}
}
_dispatcher.BeginInvoke((Action)(()=>{OnPropertyChanged("Messages");}));
}
Здесь мы используем системный таймер для проверки изменений в другом потоке, поэтому ваш пользовательский интерфейс не будет затронут любой обработкой.Когда мы хотим уведомить пользовательский интерфейс о том, что произошли изменения, мы можем использовать _dispatcher (диспетчер пользовательского интерфейса, который мы создаем в конструкторе) для «BeginInvoke» метода в потоке пользовательского интерфейса.
Это заставит ваше приложение появитьсяБыстрее.Хорошее эмпирическое правило - как можно больше избегать потока Dispatcher;используйте его только тогда, когда вы что-то делаете с пользовательским интерфейсом.Вся остальная обработка должна выполняться в фоновом потоке.
Надеюсь, это поможет