我正在处理一个相当大的.NET WPF实时应用程序。该应用程序运行良好,符合预期,除了一个大问题- UI更新速度慢。
这个应用程序高度事件驱动,有各种事件触发-通过这些事件更新UI。
其中一些事件阻塞了UI无法立即显示。当所有工作完成后,UI才显示预期结果。
是否有办法确定哪个事件处理程序导致瓶颈?
我正在处理一个相当大的.NET WPF实时应用程序。该应用程序运行良好,符合预期,除了一个大问题- UI更新速度慢。
这个应用程序高度事件驱动,有各种事件触发-通过这些事件更新UI。
其中一些事件阻塞了UI无法立即显示。当所有工作完成后,UI才显示预期结果。
是否有办法确定哪个事件处理程序导致瓶颈?
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线程!
您是否拥有代码分析器?这是它们擅长的类型。如果没有,建议获取一个。
除了使用分析器外,您可以通过在怀疑的代码块的开头和结尾放置计时语句来进行“穷人版”分析。甚至可以使用断点并用挂钟计时。如果问题发生在单击某个内容时,请从那里开始。如果是无用户交互的重复问题,请从计时器开始。
至于实际解决问题...除非有问题的处理程序正在执行可以更高效的操作,否则请考虑采用多线程方法。对于.NET 4.0来说,新的任务库真的非常出色。