Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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
Wpf 如何诊断应用程序中UI线程上的挂起?_Wpf_Performance_Rendering - Fatal编程技术网

Wpf 如何诊断应用程序中UI线程上的挂起?

Wpf 如何诊断应用程序中UI线程上的挂起?,wpf,performance,rendering,Wpf,Performance,Rendering,我正在构建一个WPF桌面应用程序,它的UI虽然是动态的,但在我看来并不是特别苛刻。此应用程序中的典型用户控件实现了一个包含两列网格的扩展程序,其中一列包含标签,另一列包含文本框或组合框。扩展器内容的XAML如下所示: <DockPanel Style="{StaticResource Style_ExpandedGridRowView}" Focusable="False"> <DockPanel.Resources> <

我正在构建一个WPF桌面应用程序,它的UI虽然是动态的,但在我看来并不是特别苛刻。此应用程序中的典型用户控件实现了一个包含两列网格的扩展程序,其中一列包含标签,另一列包含文本框或组合框。扩展器内容的XAML如下所示:

<DockPanel Style="{StaticResource Style_ExpandedGridRowView}"
           Focusable="False">
    <DockPanel.Resources>
        <DataTemplate DataType="{x:Type vm:BooleanFieldViewModel}">
            <local:GridBooleanField DataContext="{Binding}" />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:ChoiceFieldViewModel}">
            <local:GridChoiceField DataContext="{Binding}" />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:CodeLookupFieldSingleSelectionViewModel}">
            <local:GridCodeLookupField DataContext="{Binding}" />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:CodeLookupFieldMultipleSelectionViewModel}">
            <local:GridCodeLookupMultiSelectField DataContext="{Binding}"/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:CurrencyFieldViewModel}">
            <local:GridCurrencyField DataContext="{Binding}" />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:DateFieldViewModel}">
            <local:GridDateField DataContext="{Binding}" />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:NotesFieldViewModel}">
            <local:GridNotesField DataContext="{Binding}" />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:NumberFieldViewModel}">
            <local:GridNumberField DataContext="{Binding}" />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:TextFieldViewModel}">
            <local:GridTextField DataContext="{Binding}" />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:TimeFieldViewModel}">
            <local:GridTimeField DataContext="{Binding}" />
        </DataTemplate>
    </DockPanel.Resources>
    <AdornerDecorator>
        <ItemsControl ItemsSource="{Binding Fields, Mode=Default}"
                      Focusable="False">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Vertical"
                                Grid.IsSharedSizeScope="True" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </AdornerDecorator>
</DockPanel>
一旦内容最终呈现,我就可以打开和关闭扩展器,而不会有任何可察觉的延迟

无论我使用的是调试版本还是发布版本,无论我是在IDE中运行还是在桌面上运行,延迟都会发生

我尝试过使用不同版本的.NET framework进行构建,但没有效果

我推测这里发生的是渲染线程中的某种死锁。我的意思是,我想不出一个运行2GHz指令的CPU可能会花30秒的时间来计算如何在屏幕上排列30个矩形。但我看不出我有任何办法可以控制它

如何诊断此问题的原因?当然,还要修复它?正如你可能想象的,如果我不能修复它,这是一个杀死bug的项目

编辑:


我应该补充一点,我尝试过的一件事,没有用,就是禁用硬件加速。这没有明显的效果。我还尝试使用引用光栅化器,只是它太慢了,我甚至无法将应用程序挂起。

您的ItemsControl中有多少项?您是否尝试过在ItemsPanelTemplate中使用VirtualzingStackPanel?

我的控件中有多达15项。就像我说的,CPU不可能努力计算在哪里放置30个矩形。另外,我终于可以访问另一台机器,我可以把这个应用程序放在上面,它的渲染没有明显的延迟。你有没有弄清楚这件事的真相?我在Silverlight上也遇到了类似的问题,几乎在各个方面。唯一的区别是挂起并不是始终如一地发生的。
The thread '<No Name>' (0x21b0) has exited with code 0 (0x0).
The thread '<No Name>' (0x1c54) has exited with code 0 (0x0).
The thread '<No Name>' (0x1c7c) has exited with code 0 (0x0).
The thread '<No Name>' (0x2638) has exited with code 0 (0x0).
The thread '<No Name>' (0x1bf0) has exited with code 0 (0x0).