Уменьшение памяти - PullRequest
       3

Уменьшение памяти

1 голос
/ 23 февраля 2012

У меня есть Основной поток (IEnumerable) с более чем 100 000 элементов.И тогда у меня есть несколько AutoCompleteBox в моем контроле.Все эти AutoCompleteBox связаны с Основным потоком.

Первый:

Теперь проблема в том, что у меня есть около 10 AutoCompleteBox в моем контроле, и у всех есть Основной поток как их ItemsSourceтаким образом, в результате большой объем памяти.

Секунда:

Мне также нужно иметь функциональность для применения фильтров к нескольким ресурсам ItemsSource в AutoCompleteBox во время выполнения в зависимости от некоторых событий.

Мне нужно вашепредложения по уменьшению этого объема памяти и возможности применения фильтров во время выполнения.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2013

Для использования памяти для сбора данных вы должны искать Кэш последовательных данных

Пример уменьшения потребления памяти:

    public void TestAutoCompleteLookup()
    {
        var path = "";
        using (var c = SequentialDataCache<AutoCompleteItem>.Initialize())
        {
            path = c.Path;

            //add 100.000 items 
            for (int i = 0; i < 100000; i++)
            {
                c.Add(new AutoCompleteItem() { Text = string.Format("{0}Text", i) });
            }

            //query
            var pattern = "1";
            var items = c.Where(autoCompleteItem => autoCompleteItem.Text.StartsWith(pattern)).ToArray();

        }

        if (File.Exists(path))
            File.Delete(path);
    }

    [Serializable]
    private class AutoCompleteItem
    {
        public string Text { get; set; }
    }
0 голосов
/ 23 февраля 2012

Объем памяти

Я полагаю, это зависит не только от реализации вашего кода, но и от AutocompleteControlas, от того, как он использует связанный источник данных.

  • Реализуйте MainStream как вычисляемое свойство с yield return в получателе, чтобы элементы вычислялись / возвращались по требованию во время выполнения

  • Для WPF4 проверьте, используется ли AutocompleteControl с использованием виртуализации данных WPF.По сути, вы можете переопределить стандартную панель элементов, чтобы использовать VirtualizingStackPanel вместо StackPanel, чтобы инфраструктура выделяла память и создавала элементы пользовательского интерфейса только для видимых элементов, а не для всех.

Фильтрация на лету

Взгляните на подход MVVM.Было бы легко использовать свойства, привязанные к элементу управления фильтра пользовательского интерфейса, для вычисления элементов MainSTream, в основном getter использовал бы общедоступные связанные свойства, и каждый раз, когда любое из них было изменено - MainSTream пересчитывал элементы и уведомлял пользовательский интерфейс через INotifyPropertyChanged, очевидно, вам нужно реализоватьподдержка INotifyPropertyChanged.См. Объяснение одного предложения для MVVM в WPF?

public IEnumerable<IMyItem> MainStream
{
   get
   {
      foreach(var item in mainDataSource)
      {
         if (item.Name == this.NameFilterBoundToUiTextBox)
         { 
            yield return item;
         }
      }
   }
}

private string nameFilter;
public string NameFilterBoundToUiTextBox
{
   get
   {
       return this.nameFilter;
   }
   set
   {  
      if (this.nameFilter != value)
      {
         this.nameFilter = value;

         // TODO: Implement INotifyPropertyChanged
         this.OnPropertyChanged("NameFilterBoundToUiTextBox");

         // THis would notify UI to rebind MainSream
         this.OnPropertyChanged("MainStream");
      }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...