2010-09-21 112 views
4

我正在研究一個相當大的.NET WPF實時應用程序。除了一個BIG問題 - UI更新速度很慢之外,該應用程序運行良好且和預期的一樣。確定什麼是阻塞UI線程

這個應用程序是高度事件驅動的,還有事件引發全國各地的各種各樣的事情 - 通過這些事件的UI更新。

其中一項或多項事件阻止了UI立即顯示。所有工作完成後,界面顯示預期結果。

有什麼辦法可以確定哪個事件處理程序導致了瓶頸?

任何幫助,將不勝感激。

回答

6

我完全支持colithium建議使用探查器。

此外,如果阻塞花費超過一秒鐘,你可能能夠打在Visual Studio中的「暫停」鍵。在工具欄中,有一個下拉列表,您可以在其中選擇「主線程」。然後它跳轉到當前阻止用戶界面的方法。

+0

謝謝你Heinze!嘗試了你的建議,它的工作非常好。非常有用和簡單的技巧要記住。相信與否,這是造成問題的應用程序日誌。使用log4net appender更新RichTextBox日誌UI。 – c0D3l0g1c 2010-09-21 09:50:26

+0

有時,最簡單的事情可能有效:) +1 – colithium 2010-09-21 10:01:39

5

您是否有權訪問代碼分析器?這是他們擅長的類型。如果答案是否定的,我建議獲得一個。

除了使用探查器。您可以通過在您懷疑的代碼塊的開始和結尾放置時序語句來執行「窮人的」分析。你甚至可以使用一個斷點,並使用掛鐘來計時。當你點擊某個東西時,問題是否會發生?如果是這樣的話。這是一個沒有用戶交互的反覆出現的問題嗎?然後從計時器開始。

至於真正解決問題......除非違規處理程序做的事情可以更高效,考慮採用多線程方式。 .NET 4.0的新任務庫在這方面真的很棒。

+0

嗨Colithium。感謝您的迴應。該應用程序是多線程的 - 在我的Linq查詢和循環中使用Parallelism。另外,我沒有使用Thread對象,而是使用Task.Factory.StartNew進行多線程。該應用程序不包含計時器或任何背景工作者。我有一個主要的非阻塞任務(線程),其中只包含業務邏輯,即根本沒有UI交互。此任務中的邏輯採取某些行動並引發與這些行爲相關的事件。我正在使用VS2010 - 它有一個分析器。不知道如何使用它以及如何評估結果。 – c0D3l0g1c 2010-09-21 09:35:41

1

一階approxximation,我發現它有用的調試器(在IDE中的暫停按鈕)破發,並期待在堆棧。這樣做幾次,你可以看到是否有一個模式。你總是在同一個功能?你是否在做一件事情昂貴的迴應?你是否收到了你期望的更多活動?這是低科技,但可以非常有效。

8
public class UIBlockDetector 
{ 
    static Timer _timer; 
    public UIBlockDetector(int maxFreezeTimeInMilliseconds = 200) 
    { 
     var sw = new Stopwatch(); 

     new DispatcherTimer(TimeSpan.FromMilliseconds(10), DispatcherPriority.Send, (sender, args) => 
     { 
      lock (sw) 
      { 
       sw.Restart(); 
      } 

     }, Application.Current.Dispatcher); 

     _timer = new Timer(state => 
     { 
      lock (sw) 
      { 
       if (sw.ElapsedMilliseconds > maxFreezeTimeInMilliseconds) 
       { 
        // Debugger.Break() or set breakpoint here; 
        // Goto Visual Studio --> Debug --> Windows --> Theads 
        // and checkup where the MainThread is. 
       } 
      } 

     }, null, TimeSpan.FromMilliseconds(0), TimeSpan.FromMilliseconds(10)); 

    } 

} 

在MainWindow的構造函數中新建這個類。當斷點擊中時,你可以進入Visual Studio - > Debug - > Windows - > Threads並查看哪些操作阻塞了你的UI-Thread!

+0

我們該如何使用它? – MonsterMMORPG 2015-01-15 11:26:14

+0

在您選擇的plce中新建類+在「if(sw.ElapsedMilliseconds> maxFreezeTimeInMilliseconds)」中設置斷點。這個類只是主線程的監視邏輯。 – Andreas 2015-01-19 12:30:37

+0

你在這裏使用什麼計時器? – frostymarvelous 2016-03-22 14:27:59