fix: fix memory leaks

This commit is contained in:
Иванов Иван 2024-08-21 22:39:22 +02:00
parent 4e2e108076
commit 914f6ba20f
9 changed files with 80 additions and 8 deletions

View File

@ -62,6 +62,14 @@ namespace Client.Application.ViewModels
this.pathMover = pathMover; this.pathMover = pathMover;
} }
public void UnsubscribeAll()
{
creature.PropertyChanged -= Creature_PropertyChanged;
creature.Transform.Position.PropertyChanged -= Position_PropertyChanged;
hero.Transform.Position.PropertyChanged -= HeroPosition_PropertyChanged;
hero.PropertyChanged -= Hero_PropertyChanged;
}
private void HeroPosition_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) private void HeroPosition_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
{ {
OnPropertyChanged("Distance"); OnPropertyChanged("Distance");

View File

@ -109,6 +109,16 @@ namespace Client.Application.ViewModels
MouseRightClickCommand = new RelayCommand(async (o) => await OnMouseRightClick(o)); MouseRightClickCommand = new RelayCommand(async (o) => await OnMouseRightClick(o));
} }
public void UnsubscribeAll()
{
creature.PropertyChanged -= Creature_PropertyChanged;
creature.Transform.PropertyChanged -= Transform_PropertyChanged;
creature.Transform.Position.PropertyChanged -= Position_PropertyChanged;
creature.VitalStats.PropertyChanged -= VitalStats_PropertyChanged;
hero.Transform.Position.PropertyChanged -= HeroPosition_PropertyChanged;
hero.PropertyChanged -= Hero_PropertyChanged;
}
private void VitalStats_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) private void VitalStats_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
{ {
if (e.PropertyName == "Hp" || e.PropertyName == "MaxHp") if (e.PropertyName == "Hp" || e.PropertyName == "MaxHp")

View File

@ -92,6 +92,13 @@ namespace Client.Application.ViewModels
MouseRightClickCommand = new RelayCommand(async (o) => await OnMouseRightClick(o)); MouseRightClickCommand = new RelayCommand(async (o) => await OnMouseRightClick(o));
} }
public void UnsubscribeAll()
{
drop.PropertyChanged -= Drop_PropertyChanged;
drop.Transform.Position.PropertyChanged -= DropPosition_PropertyChanged;
hero.Transform.Position.PropertyChanged -= HeroPosition_PropertyChanged;
}
private void HeroPosition_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) private void HeroPosition_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
{ {
OnPropertyChanged("Distance"); OnPropertyChanged("Distance");

View File

@ -73,24 +73,31 @@ namespace Client.Application.ViewModels
this.hero = hero; this.hero = hero;
this.worldHandler = worldHandler; this.worldHandler = worldHandler;
this.pathMover = pathMover; this.pathMover = pathMover;
drop.PropertyChanged += Creature_PropertyChanged; drop.PropertyChanged += Drop_PropertyChanged;
drop.Transform.Position.PropertyChanged += Position_PropertyChanged; drop.Transform.Position.PropertyChanged += DropPosition_PropertyChanged;
hero.Transform.Position.PropertyChanged += HeroPosition_PropertyChanged; hero.Transform.Position.PropertyChanged += HeroPosition_PropertyChanged;
MouseLeftClickCommand = new RelayCommand(OnMouseLeftClick); MouseLeftClickCommand = new RelayCommand(OnMouseLeftClick);
MouseRightClickCommand = new RelayCommand(async (o) => await OnMouseRightClick(o)); MouseRightClickCommand = new RelayCommand(async (o) => await OnMouseRightClick(o));
} }
public void UnsubscribeAll()
{
drop.PropertyChanged -= Drop_PropertyChanged;
drop.Transform.Position.PropertyChanged -= DropPosition_PropertyChanged;
hero.Transform.Position.PropertyChanged -= HeroPosition_PropertyChanged;
}
private void HeroPosition_PropertyChanged(object? sender, PropertyChangedEventArgs e) private void HeroPosition_PropertyChanged(object? sender, PropertyChangedEventArgs e)
{ {
OnPropertyChanged("Position"); OnPropertyChanged("Position");
} }
private void Position_PropertyChanged(object? sender, PropertyChangedEventArgs e) private void DropPosition_PropertyChanged(object? sender, PropertyChangedEventArgs e)
{ {
OnPropertyChanged("Position"); OnPropertyChanged("Position");
} }
private void Creature_PropertyChanged(object? sender, PropertyChangedEventArgs e) private void Drop_PropertyChanged(object? sender, PropertyChangedEventArgs e)
{ {
if (e.PropertyName == "Name" || e.PropertyName == "Amount") if (e.PropertyName == "Name" || e.PropertyName == "Amount")
{ {

View File

@ -105,6 +105,7 @@ namespace Client.Application.ViewModels
} }
else if (target != null && hero.Target == null) else if (target != null && hero.Target == null)
{ {
target.UnsubscribeAll();
target = null; target = null;
OnPropertyChanged("Target"); OnPropertyChanged("Target");
} }

View File

@ -6,6 +6,7 @@ using Client.Domain.Entities;
using Client.Domain.Events; using Client.Domain.Events;
using Client.Domain.Service; using Client.Domain.Service;
using Client.Domain.ValueObjects; using Client.Domain.ValueObjects;
using Microsoft.Extensions.Logging;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
@ -72,7 +73,12 @@ namespace Client.Application.ViewModels
public void Handle(CreatureDeletedEvent @event) public void Handle(CreatureDeletedEvent @event)
{ {
Creatures.RemoveAll(x => x.Id == @event.Id); var creature = Creatures.Where(x => x.Id == @event.Id).FirstOrDefault();
if (creature != null)
{
creature.UnsubscribeAll();
Creatures.Remove(creature);
}
RemoveCreature(@event.Id); RemoveCreature(@event.Id);
} }
@ -87,8 +93,18 @@ namespace Client.Application.ViewModels
public void Handle(DropDeletedEvent @event) public void Handle(DropDeletedEvent @event)
{ {
Drops.RemoveAll(x => x.Id == @event.Id); var drop = Drops.Where(x => x.Id == @event.Id).FirstOrDefault();
Map.Drops.RemoveAll(x => x.Id == @event.Id); if (drop != null)
{
drop.UnsubscribeAll();
Drops.Remove(drop);
}
var mapDrop = Map.Drops.Where(x => x.Id == @event.Id).FirstOrDefault();
if (mapDrop != null)
{
mapDrop.UnsubscribeAll();
Map.Drops.Remove(mapDrop);
}
} }
public void Handle(ChatMessageCreatedEvent @event) public void Handle(ChatMessageCreatedEvent @event)
@ -156,7 +172,12 @@ namespace Client.Application.ViewModels
private void RemoveCreature(uint id) private void RemoveCreature(uint id)
{ {
Map.Creatures.RemoveAll(x => x.Id == id); var creature = Map.Creatures.Where(x => x.Id == id).FirstOrDefault();
if (creature != null)
{
creature.UnsubscribeAll();
Map.Creatures.Remove(creature);
}
} }
private void OnToggleAI(object? sender) private void OnToggleAI(object? sender)

View File

@ -230,11 +230,16 @@ namespace Client.Application.ViewModels
{ {
foreach (var item in e.OldItems) foreach (var item in e.OldItems)
{ {
Path[0].UnsubscribeAll();
Path.RemoveAt(0); Path.RemoveAt(0);
} }
} }
else if (e.Action == NotifyCollectionChangedAction.Reset) else if (e.Action == NotifyCollectionChangedAction.Reset)
{ {
foreach (var item in Path)
{
item.UnsubscribeAll();
}
Path.RemoveAll(); Path.RemoveAll();
} }
} }

View File

@ -69,6 +69,11 @@ namespace Client.Application.ViewModels
hero.Transform.Position.PropertyChanged += HeroPosition_PropertyChanged; hero.Transform.Position.PropertyChanged += HeroPosition_PropertyChanged;
} }
public void UnsubscribeAll()
{
hero.Transform.Position.PropertyChanged -= HeroPosition_PropertyChanged;
}
private void HeroPosition_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) private void HeroPosition_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
{ {
OnPropertyChanged("From"); OnPropertyChanged("From");

View File

@ -38,6 +38,14 @@ namespace Client.Application.ViewModels
this.hero = hero; this.hero = hero;
} }
public void UnsubscribeAll()
{
creature.PropertyChanged -= Creature_PropertyChanged;
creature.Transform.Position.PropertyChanged -= Position_PropertyChanged;
creature.VitalStats.PropertyChanged -= VitalStats_PropertyChanged;
hero.Transform.Position.PropertyChanged -= HeroPosition_PropertyChanged;
}
private void VitalStats_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) private void VitalStats_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
{ {
if (e.PropertyName == "Hp") if (e.PropertyName == "Hp")