2

この質問を検索しましたが、何百万ものエントリを含むテーブルをロードしている質問しか見つかりませんでした。これは私の状況には当てはまりません。

私はWPFとEntity Frameworkを初めて使用しています。Visual Studio 2010 データ ソース ウィザードを使用して、データベースへの接続を追加しました。ドラッグ アンド ドロップを使用して、ビューをデータ ソースから WPF ウィンドウにドラッグしました。ビューには約 32,000 レコードしか含まれておらず、選択に約 15 秒かかります。

初めてアプリケーションをビルドして実行したとき、正常に動作し、ウィンドウにデータが表示されました。違いを感じるために、ListView と Datagrid の両方に同じデータを表示しますが、コントロールの 1 つだけを使用しても違いはありません。

アプリケーションを 2 回目に実行すると、起動が完了しません。「ビジー」カーソルを表示するだけで、しばらくすると OutOfMemoryException がスローされます。タスク マネージャーでパフォーマンスを監視すると、例外が発生するまでメモリが増え続けます。

私はこれをデバッグしました: EF クエリの実行時には発生しません。クエリ結果をリストに保存し、それをウィンドウのデータソースに割り当てることさえしました。デバッガーで、クエリが終了し、リストが正常に生成されていることを確認できます。デバッガーで検査できます。

何もないようにメモリをリークしてスローするように見えるのは、クエリが実行されたのデータ バインディング メカニズムです。ちなみに、投稿できるコールスタックはありません。

他の誰かがこの問題を抱えていましたか?どのように解決しましたか?

ここにいくつかの詳細情報があります: Windows 7 です。

MainWindow.xaml は次のようになります。

    <Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded" 
        mc:Ignorable="d" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:my="clr-namespace:WpfApplication2">
    <Window.Resources>
        <CollectionViewSource x:Key="vMyViewSource" d:DesignSource="{d:DesignInstance my:VMyView, CreateList=True}" />
    </Window.Resources>
    <Grid DataContext="{StaticResource vMyViewSource}">
        <Grid.RowDefinitions>
            <RowDefinition Height="20"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="20"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Row="0" Text="my view in a ListView:"/>
        <ListView Grid.Row="1" 
                  ItemsSource="{Binding}" 
                  Margin="0" 
                  Name="vMyListView" 
                  SelectionMode="Single">
            <ListView.ItemContainerStyle>
                <Style>
                    <Setter Property="Control.HorizontalContentAlignment" Value="Stretch" />
                    <Setter Property="Control.VerticalContentAlignment" Value="Stretch" />
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.View>
                <GridView>
                    <GridViewColumn x:Name="IDColumn1" Header="ID" Width="80">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Margin="6,-1,-6,-1" Text="{Binding Path=ID,Mode=OneWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn x:Name="Name" Header="Name" Width="80">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Margin="-6,-1" Text="{Binding Path=Name, Mode=OneWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    ... (more GridViewColumns)
                </GridView>
            </ListView.View>
        </ListView>

        <TextBlock Grid.Row="2" Text="my view in a DataGrid:"/>

        <DataGrid Grid.Row="3" 
                  AutoGenerateColumns="False" 
                  EnableRowVirtualization="True" 
                  HorizontalAlignment="Left" 
                  ItemsSource="{Binding}" 
                  Margin="0" 
                  Name="vMyViewDataGrid" 
                  RowDetailsVisibilityMode="VisibleWhenSelected" 
                  VerticalAlignment="Top" >
            <DataGrid.Columns>
                <DataGridTextColumn x:Name="IDColumn" Binding="{Binding Path=ID}" Header="ID" Width="SizeToHeader" />
                <DataGridTextColumn x:Name="NameColumn" Binding="{Binding Path=Name}" Header="Name" Width="SizeToHeader" />
                ... (more DataGridTextColumns, also some with a CellTemplate with a TextBox inside)
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

そして、これは MainWindow の Window_Loaded メソッドです (このコードのほとんどは、データ ソース ウィザードによって自動生成されました)。

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        WpfApplication2.MyEntities MyEntities = new WpfApplication2.MyEntities();
        // Load data into VMyView. You can modify this code as needed.
        System.Windows.Data.CollectionViewSource VMyViewViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("vMyViewViewSource")));
        System.Data.Objects.ObjectQuery<WpfApplication2.VMyView> VMyViewQuery = this.GetVMyViewQuery(MyEntities);
        var data = VMyViewQuery.Execute(System.Data.Objects.MergeOption.AppendOnly).ToList(); // I added the ToList() to make the query execute here
        VMyViewViewSource.Source = data;
    } // it gets here fine and loads the data

ここに何か異常があるとは信じられません。何が起こっているのでしょうか。どうすればこの問題を解決できますか?

4

0 に答える 0