Determine what is blocking UI thread
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)); }}
Just new this class in MainWindow constructor. When the breakpoint hits, you can go to Visual Studio --> Debug --> Windows --> Threads and check what operation blocked your UI-Thread!
I fully support colithium's suggestion of using a profiler.
In addition, if the blocking takes more than a second, you might be able to hit the "Pause" button in Visual Studio. In the tool bar, there's a dropdown list where you can choose the "Main Thread". Then it jumps to the method which is currently blocking the UI.
Do you have access to a code profiler? This is the type of thing they are good at. I recommend obtaining one if the answer is no.
Besides using a profiler. You can do "poor man's" profiling by placing timing statements at the beginning and end of code blocks that you suspect. You can even use a breakpoints and time it with a wall clock. Does the issue happen when you click something? If so start there. Is it a recurring issue without user interaction? Start with timers then.
As for actually solving the problem... Unless the offending handler is doing something that can be made more efficient, consider adopting a multi-threaded approach. The new Task library for .NET 4.0 is really amazing in this regard.