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!
我完全支持colithium建议使用分析器.
此外,如果阻塞花费的时间超过一秒,您可以在Visual Studio中点击"暂停"按钮.在工具栏中,有一个下拉列表,您可以在其中选择"主线程".然后它跳转到当前阻止UI的方法.
你有权访问代码分析器吗?这是他们擅长的东西.如果答案是否定的,我建议你买一个.
除了使用分析器.您可以通过在您怀疑的代码块的开头和结尾放置计时语句来进行"穷人"分析.您甚至可以使用断点并使用挂钟计时.点击什么时会出现问题吗?如果是这样的话就从那 没有用户互动,这是一个反复出现的问题吗?然后从计时器开始.
至于实际解决问题......除非违规处理程序正在做一些可以提高效率的事情,否则考虑采用多线程方法.在这方面,.NET 4.0的新任务库真的很棒.