Gilad
Gilad

Reputation: 6595

Avalon docking manager memory leak

I have noticed a memory leak in my code I used Ants memory profiler to see where is the memory leak coming from the only operation I'm doing is switching tabs in my application.

I have upgraded from WPF extended tool kit 2.0.0.0 -> 2.5.0.0 but this didn't solve my problem

here is the graph coming out from ants enter image description here

there is an collectionchangedeventhandler which has 7 instances everything is located inside an obserablecollection<BaseViewerTabItem>

here is part of my code:

 public class ViewerBaseViewModel : ViewModelBase
    {
        protected bool IsViewerMode; // Used to identify if the image was loaded from a file to the viewer mode
        protected ImageManager _imageManager;
        private readonly IMessageBoxService _messageBoxService;
        private readonly ProgressIndicatorViewModel _progressIndicator;           
        protected ImageCollection CurrentImageCollection { get; set; }
        protected int _imageTabCounter = 1;

        private Dictionary<int, List<ImageViewerTabItem>> _groupedImages;

        public ObservableCollection<BaseViewerTabItem> OpenViewers { get; private set; }

The class ImageViewerTabItem register to the OpenViewersCollectionChanged event and also unregister from it as you can see

public ImageViewerTabItem(RelayCommand<ImageViewerTabItem> closeTabCommand, RelayCommand<ImageViewerTabItem> duplicateTabcommand, RelayCommand<AttachableItem> attachTabCommand,
            RelayCommand<ImageViewerTabItem> detachTabCommand, RelayCommand ungroupAllCommand, RelayCommand groupAllCommand, ObservableCollection<BaseViewerTabItem> openViewers, Dictionary<int, List<ImageViewerTabItem>> groupedImages)
        {
            _closeTabCommand = closeTabCommand;
            _duplicateTabcommand = duplicateTabcommand;
            _attachTabCommand = attachTabCommand;
            _detachTabCommand = detachTabCommand;
            _ungroupAllCommand = ungroupAllCommand;
            _groupAllCommand = groupAllCommand;
            OpenViewers = openViewers;
            _groupedImages = groupedImages;
            OpenViewers.CollectionChanged += OpenViewersChanged;
        }

public void TearDown()
        {
            OnTabClosed();
            OpenViewers.CollectionChanged -= OpenViewersChanged;
            ImageContentViewModel.TearDown();
        }

here is my Xaml code

<Grid>
        <xcad:DockingManager DocumentsSource="{Binding OpenViewers}"
                             x:Name="MainTabControl"
                             LayoutItemTemplate="{StaticResource imageSelectionTemplate}"
                             ActiveContent="{Binding ActiveTabItem, Mode=TwoWay}"
                             DocumentHeaderTemplate="{StaticResource DocumentHeaderDataTemplate}"
                             DocumentTitleTemplate="{StaticResource DocumentTitleDataTemplate}" IsHitTestVisible="True" VerticalContentAlignment="Stretch" VerticalAlignment="Stretch">
            <xcad:LayoutRoot>
                <xcad:LayoutPanel Orientation="Horizontal" >
                    <xcad:LayoutDocumentPane />
                    </xcad:LayoutPanel>
                </xcad:LayoutRoot>

        </xcad:DockingManager>
    </Grid>

Can you suggest where my problem could be?
or how to find the memory leak?
Can Avalon dock have a memory leak?

Upvotes: 2

Views: 444

Answers (0)

Related Questions