|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
MVVM Утечка памяти12.06.2022, 20:22. Показов 4424. Ответов 82
Метки нет (Все метки)
Собственно сделал подписку:
_messageService.MessagesChanged += OnMessagesChanged; в VM. А отписывать-то как? Сделал так: https://github.com/LimeniyeCyb... del.cs#L82 Но даже не понимаю.что сделал. Этого будет достаточно?
0
|
|
| 12.06.2022, 20:22 | |
|
Ответы с готовыми решениями:
82
Утечка памяти в Awesomium WebControl |
|
|
||
| 16.06.2022, 21:59 | ||
ObservableCollection... Осталось разобраться в этой куче предложений
0
|
||
|
Модератор
|
||
| 16.06.2022, 22:07 | ||
|
Это подойдёт только для редко обновляемой коллекции единичными элементами. Для быстрых обновлений и/или пакетных обновлений нужна локировка.
2
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 16.06.2022, 22:22 [ТС] | |
|
Элд Хасп, я просто ни разу не видел синглтон VM и мне это упёрто не даёт покоя: "да как это так-то, в VM и синглтон?!".
Вроде как VM, это просто коннектор, что-то простое, без лишних сложных реализаций по типу этого же синглтона, разве нет? Пока синглтон -- очень удобный вариант для решения проблемы с утечкой памяти, но я сомневаюсь в его надёжности. Мне кажется, что такими действиями я навязываю ему функциональность уровня модели.
0
|
|
|
Модератор
|
||||
| 16.06.2022, 23:22 | ||||
|
Очень часто это возможно и значительно упрощает реализацию приложения. Те же локаторы и сервисы по сути создают тот же самый синглтон, но не на уровне ViewModel, а на уровне View. Синглтон несколько нарушает принципы ООП и Solid, так как VM не может знать сколько её экземпляров понадобятся View. Но в реальных приложениях вам часто приходилось сталкиваться с динамическим пересозданием VM и/или создание нескольких её экземпляров? Такое бывает нужно очень редко. При достаточном опыте, надобность в синглтонах отпадает, так как довольно хорошо представляешь себе как всё друг с другом связанно и ошибок работы с разными экземплярами просто не допускаешь. Поэтому на более высоком уровне (знаний), синглтоны редко используются. Добавлено через 4 минуты Но если у вас одна Модель (а это 99% приложений), то можно и Модель и VM сделать синглтонами. Что сложного вы увидели в реализации синглтона - я не понимаю. Для этого нужно только закрыть её единственный конструктор и предоставить единственный экземпляр через статическое свойство. Добавлено через 3 минуты Как бы безопасность он несколько ухудшает, так как к статическому экземпляру есть доступ отовсюду. Но если вы хотите строить действительно безопасное (с точки зрения хака) приложение, то Шарп в целом для этого не шибко подходит.
1
|
||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||
| 16.06.2022, 23:30 [ТС] | ||
|
Элд Хасп, ну получается так, что я создаю Model в singlton, а потом ещё и Vm в singlton. Всё singlton'ю, а по сути синглтон вообще
0
|
||
|
Модератор
|
|||||
| 17.06.2022, 00:03 | |||||
|
По вашим словам такого момента в вашем приложении нет. Если так, то значит вы где-то, сами не зная того, создаёте новые ненужные экземпляры VM. И надо выявить где это происходит и пресечь это. Он у вас ничего не делает, нигде не вызывается, и только захламляет код. Dispose() - должен вызываться для освобождения НЕУПРАВЛЯЕМЫХ ресурсов. И где у вас такие? Надо искать где вы создаёте ненужные экземпляры VM, если дело, вообще, в этом.
0
|
|||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||
| 17.06.2022, 14:41 [ТС] | ||
|
По-моему это было тут https://github.com/LimeniyeCyb... ewModel.cs (а может и не тут, я не помню). В общем, почему утечка -- не знаю, я маслёнок в этом ( Нужно почитать и посмотреть на эту тему тем.
0
|
||
|
|
|||||||
| 18.06.2022, 13:09 | |||||||
BindingOperations.EnableCollectionSynchronization (ICollection.SyncRoot);? Ведь эта штука из Namespace: System.Windows.Data Assembly: PresentationFramework.dll BindingOperations.EnableCollectionSynchronization Method Можно какой нить простой примерчик для MVVM?
0
|
|||||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||
| 18.06.2022, 14:13 [ТС] | ||||||
|
Andrey-MSK, как я понял вот так:
Но если да, тогда я не понимаю зачем нужна тогда строка 5.
0
|
||||||
|
Модератор
|
|||||
| 18.06.2022, 14:49 | |||||
|
По феншую - при создании экземпляра VM на уровне App, там же происходит и вызов этого метода или передавать в VM делегат метода вызова. Так же надо помнить что если возможна замена коллекции или VM нужно уничтожить, то нужно отписывать привязки от коллекции (DisableCollectionSynchronization). Для очень динамичного изменения, можно реализовать локировку только во время записи. Добавлено через 8 минут Вероятность очень маленькая, то всё же есть когда по времени совпадут обновления UI и добавление единичного элемента. Но это (как и пример от Andrey-MSK) скорее относится к потокобезопасности чем к исключениям от обновления из других потоков. Для предотвращения исключений в представлении достаточно просто уведомить о локере и потом можно "забыть" про это. А вот для группового обновления (AddRange) это весьма полезно, так как до завершения всех обновлений коллекции обновление её представления не будет происходить. В UWP - не будет.
1
|
|||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 18.06.2022, 14:53 [ТС] | |
|
Элд Хасп, то есть по сути эта строка свойству SyncRoot коллекции задаёт текущий Dispatcher ?
0
|
|
|
Модератор
|
||
| 18.06.2022, 15:05 | ||
|
Это нюансы реализации ItemsControl. Если есть локер, то происходит маршалинг CollectionChanged в UI поток. Если нет локера, то просто выкидывается исключение. Сделано так из-за того, что ItemsControl не знает какой механизм потокобезопасности будет использован при работе с коллекцией. Для более сложных способов (чем простой локер) используется перегрузка EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback). Поэтому в простых случаях, достаточно уведомить о локере, чтобы просто предотвратить выброс исключений.
1
|
||
|
Модератор
|
||
| 18.06.2022, 15:55 | ||
|
ItemsControl контрол - это DependecyObject. Дефолтным для DependecyObject является обеспечение поткобезопасности через работу работу со всеми данными в одном и том же потоке связанном с Диспетчером этого DependecyObject. Если же изменение данных происходит в других потоках, то для ItemsControl - это неизвестный механизм и происходит выкидывание исключения. Вообще, конечно, с маршалингом событий в MS перемудрили. В WPF PropertyChanged автоматически маршализируется в UI поток, а CollectionChanged и CanExecuteChanged - нет. В UWP - наоборот: CollectionChanged и CanExecuteChanged - маршализируются , а PropertyChanged - нет. Зачем эту путаницу ввели - ума не приложу. Сделали бы для всех маршалинг или без него. Из-за этого приходится учитывать особенности типа View на уровне VM и даже, иногда, Model. Если бы не это, то почти всегда можно было бы реализовывать VM в Standard. И уже потом выбирать какого типа подключать к ней View.
1
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 18.06.2022, 16:47 [ТС] | |
|
Элд Хасп, Вы постоянно говорите "маршалинг".
Но для меня это очень расплывчатая тема. Искал по этому поводу информацию: это вообще для среиализации и дессериализации данных. Есть ещё класс Marshal, как мне помнится, он вроде что-то там с неуправляемыми ресурсами делает Что такое класс Marshal Вообще путаюсь зачем вообще нужен "маршалинг"
0
|
|
|
Модератор
|
||
| 18.06.2022, 17:05 | ||
Marshal - очень многозначное слово. Возможно в программировании используется смысл "размещать".Надо поинтересоваться о происхождении термина у тех кто более подкован в теории и основах Шарпа. OwenGlendower и kolorotur можете что-то прояснить? Добавлено через 3 минуты limeniye, что интересно - Гугл переводчик не переводит его на русский смысл, а транслитерирует. То есть по его мнению, это уже устойчивый термин и для русского программ. сленга.
1
|
||
|
Модератор
|
||
| 18.06.2022, 17:08 | ||
|
limeniye, вот и русское толкование: Маршалинг
Маршалинг события - это получение данных из метода вызванного в одного потоке и вызов метода с этими данными в другом потоке.
0
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||
| 18.06.2022, 17:30 [ТС] | ||
|
Я понимаю как сереализовать .xml или .json формат в какой-то CLR тип, например.
Не знаю как это работает под капотом, но думаю это не особо важно. Я более-менее пониманию как работает RPC сериализация: перевод в байты и десериализация байт в CLR. А вот:
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 18.06.2022, 18:09 | ||
|
Работник аэродрома, машущий самолетам фонариками или принимающий/запускающий с авианосцев — маршал. to marshal (маршаллить) — производный глагол. ЖД вагоны на сортировочной станции маршаллятся. Не проверял, но не удивлюсь если звание Маршал в вооруженных силах оттуда же (или наоборот) — тот, кто движет войсками. Marshal в программировании — часть системы, ответственная за направление/перевод данных из одной среды в другую: в шарпе — из неуправляемой в управляемую и наоборот.
2
|
||
| 18.06.2022, 18:27 | |
|
0
|
|
|
Модератор
|
|||||||
| 18.06.2022, 19:53 | |||||||
|
Относительно ObservableCollection - это перекидка события CollectionChanged (обычно метода подымающего событие) в UI поток. Простейший пример такого "модифицированного" ObservableCollection:
Проблема такой реализации в зависимости Dispatcher от типа View и как следствие несовместимость реализаций Framework, Core (.Net), UWP. По идее такой класс должен писаться на Standard, а в нём нет Dispatcher. Приходится определять контекст синхронизации потоков слушателей и маршилировать в них. Такая реализация уже значительно сложнее. Пример для команд: Исполнение делегатов обобщённого типа
1
|
|||||||
| 18.06.2022, 19:53 | |
|
Возможна ли утечка памяти в следующем коде Утечка памяти при обновлении текста TextBlock Утечка памяти при большом количестве сообщений Программа не может продолжить работу, так как недостаточно памяти. Утечка в WPF? HttpWebRequest, расход памяти непомерно больших объемов и , как следствие, утечка памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek
ВВЕДЕНИЕ
Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
|
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
|