【问题标题】:WPF - Added a Listbox, got a COM errorWPF - 添加了一个列表框,出现 COM 错误
【发布时间】:2018-05-27 12:45:04
【问题描述】:

我有一个相当简单的单线程程序 C#/WPF 程序。它有几个按钮和一个画布;它加载一个文件并显示一些图形。它有一些双精度和布尔数组,总计约 1G,直到现在它工作正常。它没有显式做任何互操作,也没有显式引用任何 COM 对象,但我不知道框架在幕后做了什么。它专为 AnyCPU 构建并在 x64 系统上运行

我添加了一个 ListBox,现在运行它时出现 COM 错误。 . .

未处理的类型异常 在 mscorlib.dll 中发生“System.Runtime.InteropServices.COMException” 附加信息:没有足够的存储空间来处理 这个命令。 (HRESULT 异常:0x80070008)

在调试器中单步执行错误似乎发生在它执行主窗口构造函数之后,其中分配了所有数组空间,当它第一次显示 UI 时。从字面上看,我可以在 c'tor 的右花括号上断点,但如果我从那里按 F11,它就会爆炸。

XAML 中的资源绑定:

<!-- Resource for the plylist -->
<Window.Resources>
    <ObjectDataProvider x:Key="plies" ObjectType="{x:Type local:Plies}"/>
    <DataTemplate x:Key="ThePlies" DataType="Partition1.MyPly">
        <StackPanel >
            <TextBlock Text="{Binding Path=PlyName}" FontFamily="Arial" 
                       FontSize="18"/>
        </StackPanel>
    </DataTemplate>
</Window.Resources>

XAML 中的 ListBox ...

<ListBox BorderBrush="DarkGray" Width="200" Height="300" BorderThickness="3" Margin="10,100,0,0"
         Padding="0" Background="White"   HorizontalAlignment="Left"  VerticalAlignment="Top"
         ItemsSource="{Binding Source={StaticResource plies}}"
         ItemTemplate="{StaticResource ThePlies}"/>

C# 看起来像这样。 . .

public class MyPly
{
    public string PlyName { get; set; }
    public MyPly(string plyName)
    {
        this.PlyName = plyName;
    }
}


public class Plies : List<MyPly>
{
    public Plies()
    {
        this.Add(new MyPly("PLY ONE"));
        this.Add(new MyPly("PLY TWO"));
        this.Add(new MyPly("PLY THREE"));
        this.Add(new MyPly("PLY FOUR"));
        this.Add(new MyPly("PLY FIVE"));
        this.Add(new MyPly("PLY SIX"));
        this.Add(new MyPly("PLY SEVEN"));
        this.Add(new MyPly("PLY EIGHT"));
        this.Add(new MyPly("PLY NINE"));
    }
} 

我如何找出造成这种情况的原因,以及是什么耗尽了我的存储空间?


已解决

- 我找到了原因 - 我找到了实际问题,它涉及与该项目相关的另一个 SO 帖子(在撰写本文时已收到 0 个 cmets 或答案)https://stackoverflow.com/questions/35464287/xaml-errors-only-in-x64。 由于我无法使用此 XAML 构建 x64,因此我将构建设置为 AnyCPU。我在 64 位机器上,运行 64 位版本的 Win7,所以 AnyCPU 应该只是 JIT 到 64 位,对吧?

错了。因为 Visual Studio 在项目属性中有一个鲜为人知的复选框,所以构建设置称为“首选 32 位”,它基本上覆盖了您对 64 位的期望。所以我实际上在构造函数中内存不足,但我不知道。当我进入调试异常并启用“公共语言运行时”异常时,我在初始化期间遇到了崩溃,而它仍在进行构建。

我取消选中“首选 32 位”,我的 COM 错误消失了。

【问题讨论】:

  • 机器有多少内存可用?
  • 8G。在我运行这个程序之前,操作系统和其他程序正在消耗大约 3G。当我运行这个程序并分配它的所有数组时,操作系统使用的总数,所有其他程序加上这个程序大约是 4G。
  • 内存中是否有大于 2 GB 的单个对象?
  • 据我所知,代码看起来还不错。您可以尝试再次删除列表框或通过按钮延迟填充它。奇怪的是,我只在有故障的内存/硬盘系统和过度使用系统资源上看到此错误,如下所述:stackoverflow.com/questions/548971/…
  • 堆栈跟踪对于获得解释非常重要,最好是通过启用非托管调试生成的。这是一个 Windows 错误,错误代码 8。请确保不要将 WPF 与 WinRT 混淆,它们看起来有点相似,但实际上却有很大不同。如果是 WPF,那么最可能的根本原因是内核内存池有问题或视频驱动程序出现问题。重新启动机器并重试。

标签: c# wpf listbox


【解决方案1】:

如果错误仅在您添加 ListBox 后才开始,则问题很可能是因为 UI 试图一次将数组中的所有项加载到 ListBox 中。这将导致某些系统崩溃或其他系统出现很长时间的延迟。

尝试在 XAML 中为您的 ListBox 设置此属性:

VirtualizingPanel.IsVirtualizing="True"

【讨论】:

  • 我发现了问题 - 请参阅编辑。我为所有参与其中的人 +1 了。谢谢,但这是我的错。
猜你喜欢
  • 2017-12-20
  • 2011-04-09
  • 2013-03-31
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多