确定什么是阻止UI线程

c0D*_*g1c 7 .net wpf user-interface multithreading block

我正在开发一个相当大的.NET WPF实时应用程序.该应用程序运行良好,正如预期的那样,除了一个大问题 - UI更新很慢.

这个应用程序是高度事件驱动的,有各种各样的事件引发 - 通过这些事件UI更新.

这些事件中的一个或多个阻止UI立即显示.完成所有工作后,UI会显示预期结果.

有没有办法确定哪个事件处理程序导致瓶颈?

任何帮助,将不胜感激.

And*_*eas 13

  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));

    }

}
Run Code Online (Sandbox Code Playgroud)

在MainWindow构造函数中新建这个类.当断点命中时,您可以转到Visual Studio - > Debug - > Windows - > Threads并检查哪些操作阻止了您的UI-Thread!


Hei*_*nzi 8

我完全支持colithium建议使用分析器.

此外,如果阻塞花费的时间超过一秒,您可以在Visual Studio中点击"暂停"按钮.在工具栏中,有一个下拉列表,您可以在其中选择"主线程".然后它跳转到当前阻止UI的方法.


col*_*ium 5

你有权访问代码分析器吗?这是他们擅长的东西.如果答案是否定的,我建议你买一个.

除了使用分析器.您可以通过在您怀疑的代码块的开头和结尾放置计时语句来进行"穷人"分析.您甚至可以使用断点并使用挂钟计时.点击什么时会出现问题吗?如果是这样的话就从那 没有用户互动,这是一个反复出现的问题吗?然后从计时器开始.

至于实际解决问题......除非违规处理程序正在做一些可以提高效率的事情,否则考虑采用多线程方法.在这方面,.NET 4.0的新任务库真的很棒.