|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
MVVM Утечка памяти12.06.2022, 20:22. Показов 4573. Ответов 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, расход памяти непомерно больших объемов и , как следствие, утечка памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки
Правым кликом по серверу -> отладочная информация -> edit
Заменить "net": "raw", на "net": "tcp",
Нажать кнопку reload.
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|