2010-10-20 38 views
11

我們在WPF中有一個應用程序,它通過ObservableCollection顯示數據。 5分鐘後,我想刷新數據。用WPF中的定時器刷新UI(帶BackgroundWorker?)

我想我可以使用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(); 
     } 
    } 
} 

,我應該如何進行的任何建議嗎?

+0

線程有問題嗎?什麼問題呢? – 2010-10-20 19:31:45

回答

37

爲什麼不使用DispatcherTimer?這將在調度程序線程中「打勾」。

除此之外,僅僅從您的描述「線程有問題」中很難說出什麼問題。

+9

說真的,我需要得到你的低掛水果通知算法。 – Will 2010-10-20 19:48:19