Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF性能工具,用于显示UI线程何时锁定以及锁定时间_C#_Wpf_Performance Testing_Ui Thread - Fatal编程技术网

C# WPF性能工具,用于显示UI线程何时锁定以及锁定时间

C# WPF性能工具,用于显示UI线程何时锁定以及锁定时间,c#,wpf,performance-testing,ui-thread,C#,Wpf,Performance Testing,Ui Thread,我肯定这个已经存在了,但还没找到。我正在寻找一个WPF控件,它在我的应用程序上显示某种动画,这样我就可以很容易地判断UI线程何时锁定。我希望控件也能显示UI线程被锁定的时间。这将是一个开发工具,我只会在调试模式下运行时启用,当UI长时间无响应时,它将用于识别应用程序中的性能问题。因此,我正在寻找类似的东西 我知道我可以自己写一本,但我相信其他人已经写过了(而且可能比我写得更好)。如果你知道一个,请与我分享。谢谢 我昨天打算回复这个问题,但没有一个完整的解决方案,只是一个建议 我已经做了类似的事情

我肯定这个已经存在了,但还没找到。我正在寻找一个WPF控件,它在我的应用程序上显示某种动画,这样我就可以很容易地判断UI线程何时锁定。我希望控件也能显示UI线程被锁定的时间。这将是一个开发工具,我只会在调试模式下运行时启用,当UI长时间无响应时,它将用于识别应用程序中的性能问题。因此,我正在寻找类似的东西


我知道我可以自己写一本,但我相信其他人已经写过了(而且可能比我写得更好)。如果你知道一个,请与我分享。谢谢

我昨天打算回复这个问题,但没有一个完整的解决方案,只是一个建议

我已经做了类似的事情,并创建了一个订阅CompositionTarget的控件。渲染作为“UI线程繁忙度”的简单指示器,然后在一个非常小的条形图上绘制帧速率(1.0/事件间隔时间),每秒更新一次。讨论中的条形图非常轻量级,并且使用位图而不是WPF元素,因此不会占用太多CPU时间。该控件可以覆盖在任何WPF表单上,作为调试性能问题的装饰器

这非常有启发性,因为它实时显示了UI线程退出


很抱歉,我不能将任何代码作为我公司的专有代码共享,但我认为这会让您了解如何解决此问题

为仅包含旋转矩形的任何控件创建控件模板

然后,当您处于调试模式时,在fromcodebehind处添加控件,以确保它不会进入发行版

#if DEBUG
if(runtimeCondition)
{
    //add or unhide control
}
#end if
非常容易实现,这里有一个模板

<ControlTemplate x:Key="spinningSquareTemplate">
            <ControlTemplate.Resources>
                <Storyboard x:Key="OnLoaded1" RepeatBehavior="Forever">
                    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)" Storyboard.TargetName="rectangle">
                        <EasingDoubleKeyFrame KeyTime="0:0:1" Value="360"/>
                    </DoubleAnimationUsingKeyFrames>
                </Storyboard>
            </ControlTemplate.Resources>
            <Rectangle x:Name="rectangle" Fill="#FFFFB900" Stroke="Black" RenderTransformOrigin="0.5,0.5">
                <Rectangle.RenderTransform>
                    <TransformGroup>
                        <ScaleTransform/>
                        <SkewTransform/>
                        <RotateTransform/>
                        <TranslateTransform/>
                    </TransformGroup>
                </Rectangle.RenderTransform>
            </Rectangle>
            <ControlTemplate.Triggers>
                <EventTrigger RoutedEvent="FrameworkElement.Loaded">
                    <BeginStoryboard Storyboard="{StaticResource OnLoaded1}"/>
                </EventTrigger>
            </ControlTemplate.Triggers>

        </ControlTemplate>


当您的UI锁定时,方块将停止旋转。

屏幕截图、代码,两者都包含在NDA中;-)假设Windows任务管理器图表显示1.0/CompositionTarget.Rendering事件间隔时间您是否能够在测试应用程序中运行相关代码?我想象着你所描述的,但这篇文章可能与我们的想法不同。太好了!在单独的窗口中使用单独的调度程序启动此控件可能是值得的,这样锁定的UI就不会锁定帧速率图表。不管是否锁定,因为我们正在计时CompositionTarget.Rendering事件(事件之间的时间)。因此,如果图表在更新时被锁定(记得我建议每1秒刷新一次),那么它仍然会显示退出。只需将X=SampleNumber乘以Y=1.0/TimeBetweenEvents即可。为了让它平稳运行,我使用了10个周期的移动平均线来平滑时间,这样它就不会跳得这么快。我发现有趣的是CompTarget.Rendering在空闲时平均为60FPS,鼠标移动时平均为120FPS(?),在UI线程非常繁忙时平均为5-10。