Неуправляемая утечка в тривиальном приложении WPF

Я столкнулся с ситуацией, где я пропускаю неуправляемую память, когда мышь отодвинута мое приложение WPF. А именно, когда я представляю приложение в perfmon или профилировщик памяти Красного Логического элемента, частные байты монотонно увеличиваются, но байты во всех управляемых "кучах" остаются постоянными - которому, я верю, средства, что приложение имеет неуправляемую утечку.

Я создал тривиальное размноженное приложение, но я не вижу, где проблема.

Приложение состоит из ListView с четырьмя объектами. Перемещение мыши быстро по этим объектам вызывает проблему.

Вот код, если Вы интересуетесь репродуцированием проблемы - это не симпатично, но это просто.

Спасибо


править: Я создал проблему Microsoft Connect для этой проблемы.


App.xaml


    
        
            
                
            
        
    

App.xaml.cs

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;

namespace WpfLeakRepro
{
    /// 
    /// Interaction logic for App.xaml
    /// 
    public partial class App : Application
    {
    }
}

Generic.xaml


    
        
        
    
    
        
        
    
    
        
            
                
                
                
                
            
        
    
    

Window1.xaml


    
        
            
                
                    
                        
                            
                                
                                    
                                
                            
                        
                        
                            
                                
                                    
                                
                            
                        
                    
                
            
        
    

Window1.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
using System.Collections.ObjectModel;
using System.IO;

namespace WpfLeakRepro
{
    public class Picture
    {
        public string Name { get; set; }
    }

    /// 
    /// Interaction logic for Window1.xaml
    /// 
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            List pictures = new List();

            string[] images = new string[] {"Blue hills.jpg", "Sunset.jpg", "Water lilies.jpg", "Winter.jpg" };

            foreach (string imagePath in images)
            {
                pictures.Add(new Picture() { Name = imagePath });
            }

            DataContext = pictures;
        }
    }
}

7
задан IV. 8 February 2010 в 14:51
поделиться

2 ответа

Проблема, похоже, связана с VisualBrush , которая использовалась для клетчатого фона. Замените это кистью SolidColorBrush , и проблема исчезнет. Но на самом деле это не имеет значения: сотрудники Microsoft посоветовали мне установить последние обновления до .NetFx 3.5sp1, и это, похоже, решает проблему (подробнее здесь ).

1
ответ дан 7 December 2019 в 03:15
поделиться

8080 зависел от внешнего оборудования для управления обработкой прерываний, поэтому его невозможно обобщить. Найдите информацию о контроллерах прерываний Intel 8214 или 8259.

-121--3579252-

Если вы не против временно вставить свой documentFragment в DOM...

function getElementFromFragById(frag, id) {
    var tempDiv = document.createElement("div");
    tempDiv.style.display = "none";
    tempDiv.appendChild(frag);
    document.body.appendChild(tempDiv);
    var elem = document.getElementById(id);
    document.body.removeChild(tempDiv);
    return document.getElementById(id) ? null : elem; //if the element still exists, we have a problem
}

Это работает надежно, если documentFragment не содержит элементов с идентификатором, которые уже существуют в документе , и требуется выполнить поиск по этому идентификатору.

-121--4518437-

Возможно, произошла известная утечка памяти в привязках WPF, которая может возникнуть при привязке к свойствам классов, не реализующих INotifyPropertyChanged . В вашем случае свойство Name класса Рисунков .

Решения устанавливают режим привязки OneTime, позволяя Picture реализовать INotifyPropertyChanged или превращая Name в свойство зависимости.

Дополнительные сведения см. в мс поддержки и этой записи блога . Эти и другие известные утечки памяти WPF можно найти здесь .

8
ответ дан 7 December 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: