我正在研究一個相當大的.NET WPF實時應用程序。除了一個BIG問題 - UI更新速度很慢之外,該應用程序運行良好且和預期的一樣。確定什麼是阻塞UI線程
這個應用程序是高度事件驅動的,還有事件引發全國各地的各種各樣的事情 - 通過這些事件的UI更新。
其中一項或多項事件阻止了UI立即顯示。所有工作完成後,界面顯示預期結果。
有什麼辦法可以確定哪個事件處理程序導致了瓶頸?
任何幫助,將不勝感激。
我正在研究一個相當大的.NET WPF實時應用程序。除了一個BIG問題 - UI更新速度很慢之外,該應用程序運行良好且和預期的一樣。確定什麼是阻塞UI線程
這個應用程序是高度事件驅動的,還有事件引發全國各地的各種各樣的事情 - 通過這些事件的UI更新。
其中一項或多項事件阻止了UI立即顯示。所有工作完成後,界面顯示預期結果。
有什麼辦法可以確定哪個事件處理程序導致了瓶頸?
任何幫助,將不勝感激。
我完全支持colithium建議使用探查器。
此外,如果阻塞花費超過一秒鐘,你可能能夠打在Visual Studio中的「暫停」鍵。在工具欄中,有一個下拉列表,您可以在其中選擇「主線程」。然後它跳轉到當前阻止用戶界面的方法。
您是否有權訪問代碼分析器?這是他們擅長的類型。如果答案是否定的,我建議獲得一個。
除了使用探查器。您可以通過在您懷疑的代碼塊的開始和結尾放置時序語句來執行「窮人的」分析。你甚至可以使用一個斷點,並使用掛鐘來計時。當你點擊某個東西時,問題是否會發生?如果是這樣的話。這是一個沒有用戶交互的反覆出現的問題嗎?然後從計時器開始。
至於真正解決問題......除非違規處理程序做的事情可以更高效,考慮採用多線程方式。 .NET 4.0的新任務庫在這方面真的很棒。
嗨Colithium。感謝您的迴應。該應用程序是多線程的 - 在我的Linq查詢和循環中使用Parallelism。另外,我沒有使用Thread對象,而是使用Task.Factory.StartNew進行多線程。該應用程序不包含計時器或任何背景工作者。我有一個主要的非阻塞任務(線程),其中只包含業務邏輯,即根本沒有UI交互。此任務中的邏輯採取某些行動並引發與這些行爲相關的事件。我正在使用VS2010 - 它有一個分析器。不知道如何使用它以及如何評估結果。 – c0D3l0g1c 2010-09-21 09:35:41
一階approxximation,我發現它有用的調試器(在IDE中的暫停按鈕)破發,並期待在堆棧。這樣做幾次,你可以看到是否有一個模式。你總是在同一個功能?你是否在做一件事情昂貴的迴應?你是否收到了你期望的更多活動?這是低科技,但可以非常有效。
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!
我們該如何使用它? – MonsterMMORPG 2015-01-15 11:26:14
在您選擇的plce中新建類+在「if(sw.ElapsedMilliseconds> maxFreezeTimeInMilliseconds)」中設置斷點。這個類只是主線程的監視邏輯。 – Andreas 2015-01-19 12:30:37
你在這裏使用什麼計時器? – frostymarvelous 2016-03-22 14:27:59
謝謝你Heinze!嘗試了你的建議,它的工作非常好。非常有用和簡單的技巧要記住。相信與否,這是造成問題的應用程序日誌。使用log4net appender更新RichTextBox日誌UI。 – c0D3l0g1c 2010-09-21 09:50:26
有時,最簡單的事情可能有效:) +1 – colithium 2010-09-21 10:01:39