2011-12-17 46 views
1

我有一個WPF & C#應用程序,它包含一個大型DataGrid,大約35列x 50行,用於監視一組頻繁變化的值。麻煩的是,當整個網格可見時,刷新它會將用戶界面掛起幾秒鐘。我每隔兩秒鐘就會明確刷新一次,這對我正在做的事很好,但讓用戶界面的其餘部分掛起是一個真正的痛苦。多線程,多分派器WPF應用程序仍然繪製單線程?

好的,所以我決定我將在單獨的窗口中使用單獨的Dispatcher在單獨的窗口中運行其餘的UI。我寫了一個玩具窗口,其中包含一個帶有增量計數的textBlock,使用DispatcherTimer每秒更新10次。但是,計數不會平穩遞增,而會在網格刷新時暫停,然後繼續顯示,計數高於暫停時的計數約10,因此計時器事件得到處理。我只是沒有看到刷新。

WPF是否只在單個線程中繪製其所有元素?任何方式呢?

這裏是我的第二窗口創建代碼:

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    ThreadStart ts = new ThreadStart(RunSpareThread); 
    m_spare_thread = new Thread(ts); 
    m_spare_thread.IsBackground = true; 
    m_spare_thread.Priority = ThreadPriority.Highest; 
    m_spare_thread.SetApartmentState(ApartmentState.STA); 
    m_spare_thread.Start(); 

    Dispatcher.Thread.Priority = ThreadPriority.Lowest; 
} 

void RunSpareThread() 
{ 
    m_spare_window = new SpareWindow(); 
    m_spare_window.Show(); 
    Dispatcher.Run(); 
} 

FYI我已經試過落實電網幾種不同的方式 - 作爲一個ListView,因爲它覆蓋的OnRender和繪製一大堆GlyphRunDrawings的帆布 - WPF在繪製這些東西時速度非常慢。

回答

3

不幸的是。這就是說你可以做很多事情來提高你的UI的響應速度。其中一個主要的事情是確保在UI線程中完成最少量的工作。這意味着在一個單獨的上下文中進行所有數據庫讀取等。你還應該看看你的網格如何顯示你的價值 - 它是虛擬化嗎?然後還有你是如何綁定數據綁定的,綁定源應該允許你在所有的修改完成後才更新綁定。

1

如果正確使用它,WPF速度非常快。

一些提示:

  1. (在MVVM條款或視圖模型)你要顯示的數據的模型實現。確保它實現了INotifyPropertyChanged接口。將這些模型的集合綁定到您的DataGrid;
  2. 不要每N秒刷新一次所有數據。您應該以某種方式檢測數據更改(使用工作線程)並在適當的模型上更新適當的屬性。由於數據綁定,所有更改將自動反映在DataGrid上。所以,你甚至不需要使用Dispatcher(至少明確地)。
  3. 使用ListView而不是DataGrid如果您不需要對數據執行特殊操作(如編輯,排序,過濾等);
  4. 如果您需要顯示大量的行,請考慮執行virtualization