Datagrid View 업데이트시 메모리 누수

안녕하세요 MVVM 패턴을 이용해 재고관리 프로그램을 만드는중인 초보 개발자입니다.

DataGridObservableCollection 을 바인딩하여 데이터를 표시하고 LINQ를 이용해 컬렉션에서 데이터를 필터링해 조건에 부합하는 값들만 DataGrid에 표시하기 위해 컬렉션을 Clear() 하고 Add() 하는 과정에서 메모리 사용량이 증가하여 GC가 발생해도 사용량이 줄어들지 않는 문제를 겪고있습니다. DataGrid를 주석처리 한 뒤 디버깅 했을때는 메모리 누수가 발생하지 않았습니다. DataGrid 뷰를 업데이트할때 효율적으로 메모리를 관리하는 방법이 없을까요?

두서없는 질문 죄송합니다.

 <DataGrid
            x:Name="WorkGrid"
            Grid.Row="4"
            Grid.RowSpan="6"
            Grid.ColumnSpan="14"
            Width="auto"
            Height="520"
            Margin="10"
            AlternationCount="2"
            AutoGenerateColumns="False"
            Background="#2c2c30"
            CanUserAddRows="False"
            CanUserResizeColumns="True"
            EnableRowVirtualization="True"
            HorizontalScrollBarVisibility="Hidden"
            IsReadOnly="True"
            ItemsSource="{Binding ResultViewList, Mode=OneWay}"
            ScrollViewer.CanContentScroll="True"
            SelectedItem="{Binding SelectedRow, Mode=TwoWay}"
            VerticalScrollBarVisibility="Visible"
            VirtualizingStackPanel.IsVirtualizing="True"
            VirtualizingStackPanel.VirtualizationMode="Recycling">           
            <DataGrid.Columns>
                <DataGridTextColumn
                    MinWidth="130"
                    Binding="{Binding WorkGroup, Mode=OneWay}"
                    Header="작업그룹"
                    IsReadOnly="True" />
                <DataGridTextColumn
                    MinWidth="115"
                    Binding="{Binding ProdCd, Mode=OneWay}"
                    Header="상품코드"
                    IsReadOnly="True" />
                <DataGridTextColumn
                    MinWidth="115"
                    Binding="{Binding Barcode, Mode=OneWay}"
                    Header="바코드"
                    IsReadOnly="True" />
                <DataGridTextColumn
                    MinWidth="200"
                    Binding="{Binding ProdNm, Mode=OneWay}"
                    Header="상품명"
                    IsReadOnly="True">
                    <DataGridTextColumn.CellStyle>
                        <Style BasedOn="{StaticResource MaterialDesignDataGridCell}" TargetType="{x:Type DataGridCell}">
                            <Setter Property="Padding" Value="0,5,0,5" />
                            <Setter Property="Width" Value="auto" />
                            <Setter Property="HorizontalAlignment" Value="Stretch" />
                            <Setter Property="TextBlock.TextAlignment" Value="Justify" />
                            <Setter Property="FocusVisualStyle" Value="{x:Null}" />
                            <Style.Triggers>
                                <Trigger Property="IsFocused" Value="True">
                                    <Setter Property="Background" Value="#2c2c30" />
                                    <Setter Property="Foreground" Value="#FEB41C" />
                                    <Setter Property="BorderBrush" Value="WhiteSmoke" />
                                    <Setter Property="BorderThickness" Value="1.5" />
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </DataGridTextColumn.CellStyle>
                </DataGridTextColumn>
                <DataGridTextColumn
                    MinWidth="90"
                    Binding="{Binding CustCd, Mode=OneWay}"
                    Header="거래처코드"
                    IsReadOnly="True" />
                <DataGridTextColumn
                    MinWidth="80"
                    Binding="{Binding CustNm, Mode=OneWay}"
                    Header="거래처명"
                    IsReadOnly="True" />
                <DataGridTextColumn
                    MinWidth="50"
                    Binding="{Binding Category, Mode=OneWay}"
                    Header="구분"
                    IsReadOnly="True" />
                <DataGridTextColumn
                    MinWidth="80"
                    Binding="{Binding Quantity, Mode=OneWay}"
                    Header="작업수량"
                    IsReadOnly="True" />
                <DataGridTextColumn
                    MinWidth="80"
                    Binding="{Binding ModQty, Mode=OneWay}"
                    CanUserSort="True"
                    Header="수정수량"
                    SortMemberPath="ModQty" />
                <DataGridTextColumn
                    MinWidth="65"
                    Binding="{Binding Worker, Mode=OneWay}"
                    Header="작업자"
                    IsReadOnly="True" />
                <DataGridTextColumn
                    MinWidth="115"
                    Binding="{Binding WorkDate, StringFormat={}{0: yyyy-MM-dd tt HH:mm}, ConverterCulture='ko-kr', Mode=OneWay}"
                    Header="작업일"
                    IsReadOnly="True" />
                <DataGridTextColumn
                    MinWidth="100"
                    Binding="{Binding Device, Mode=OneWay}"
                    Header="디바이스"
                    IsReadOnly="True" />
            </DataGrid.Columns>
        </DataGrid>
2개의 좋아요

좀더 확실한 메모리 누수 증명을 위해

재현되는 샘플 프로젝트,
메모리 스냅샷 화면,
전체 코드 (올려주신 코드는 View만 있어 이것만으로는 확인이 안됩니다.),

이러한 정보들이 필요 합니다.

.NET WPF github 이슈에서 관련 부분을 검색해 보면

메모리 누수 버그가 있다는 이슈가 있긴 한데
WPF DataGrid memory leak · Issue #6087 · dotnet/wpf (github.com)

WPF DataGrid memory leak in VS2022 · dotnet/wpf · Discussion #5785 (github.com)

등등

여기 답변자 분들이 정확히 파악하기 위해서는 앞서 말씀 드린 정보들이 추가로 필요 합니다.

5개의 좋아요

답변 감사합니다. 추후 샘플 프로젝트와 스냅샷 화면을 준비해 다시 질문하겠습니다.

2개의 좋아요

2개의 좋아요