Ответ 1
Почему бы не использовать DispatcherTimer
? Это уже будет "тикать" в потоке диспетчера.
Кроме того, трудно сказать, что неправильно только из вашего описания "есть проблема с потоками".
У нас есть приложение в WPF, которое показывает данные через ObservableCollection. Через 5 минут я хочу обновить данные.
Я думал, что могу использовать объект System.Timers.Timer
для своего события Elapsed
, а затем вызвать BackgroundWorker
, чтобы вызвать метод, который запускает задание. Этот метод относится к классу ViewModel.
Но, похоже, проблема связана с потоками.
Итак, я попробовал с Диспетчером, но опять же.
Здесь мой (упрощенный и не оптимизированный) код:
/// <summary>
/// Initializes a new instance of the <see cref="ApplicationController"/> class.
/// </summary>
public ApplicationController()
{
CreateDefaultTabs();
Timer timer = new Timer(20000); //20 secs for testing purpose.
timer.AutoReset = true;
timer.Enabled = true;
timer.Elapsed += new ElapsedEventHandler(OnTimeBeforeRefreshElapsed);
timer.Start();
}
private void OnTimeBeforeRefreshElapsed(object sender, ElapsedEventArgs e)
{
Dispatcher.CurrentDispatcher.Invoke(new Action(() => { RefreshData(); }));
Dispatcher.CurrentDispatcher.Invoke(new Action(() => { UpdateLayout(); }));
}
private void RefreshData()
{
foreach (object tab in _tabItems)
{
if (tab is TitleDetailsView)
{
TitleDetailsViewModel vm = ((TitleDetailsView)tab).DataContext as TitleDetailsViewModel;
vm.Refresh();
}
}
}
private void UpdateLayout()
{
foreach (object tab in _tabItems)
{
if (tab is TitleDetailsView)
{
TitleDetailsViewModel vm = ((TitleDetailsView)tab).DataContext as TitleDetailsViewModel;
vm.HandleGetTitleBySymbolResponse();
}
}
}
Любые предложения о том, как я должен действовать?
Почему бы не использовать DispatcherTimer
? Это уже будет "тикать" в потоке диспетчера.
Кроме того, трудно сказать, что неправильно только из вашего описания "есть проблема с потоками".
Этот ответ объясняет проблему с использованием Timer vs DispatcherTimer при обновлении пользовательского интерфейса. fooobar.com/info/242709/...
Я не пробовал это, но для периодических рабочих элементов, которые будут использовать поток, большая часть работы выглядит так, как будто это будет трюк. http://msdn.microsoft.com/en-us/library/windows/apps/xaml/jj248676.aspx