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;
}
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)
{
OnPropertyChanged("Distance");

View File

@ -109,6 +109,16 @@ namespace Client.Application.ViewModels
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)
{
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));
}
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)
{
OnPropertyChanged("Distance");

View File

@ -73,24 +73,31 @@ namespace Client.Application.ViewModels
this.hero = hero;
this.worldHandler = worldHandler;
this.pathMover = pathMover;
drop.PropertyChanged += Creature_PropertyChanged;
drop.Transform.Position.PropertyChanged += Position_PropertyChanged;
drop.PropertyChanged += Drop_PropertyChanged;
drop.Transform.Position.PropertyChanged += DropPosition_PropertyChanged;
hero.Transform.Position.PropertyChanged += HeroPosition_PropertyChanged;
MouseLeftClickCommand = new RelayCommand(OnMouseLeftClick);
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)
{
OnPropertyChanged("Position");
}
private void Position_PropertyChanged(object? sender, PropertyChangedEventArgs e)
private void DropPosition_PropertyChanged(object? sender, PropertyChangedEventArgs e)
{
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")
{

View File

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

View File

@ -6,6 +6,7 @@ using Client.Domain.Entities;
using Client.Domain.Events;
using Client.Domain.Service;
using Client.Domain.ValueObjects;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
@ -72,7 +73,12 @@ namespace Client.Application.ViewModels
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);
}
@ -87,8 +93,18 @@ namespace Client.Application.ViewModels
public void Handle(DropDeletedEvent @event)
{
Drops.RemoveAll(x => x.Id == @event.Id);
Map.Drops.RemoveAll(x => x.Id == @event.Id);
var drop = Drops.Where(x => x.Id == @event.Id).FirstOrDefault();
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)
@ -156,7 +172,12 @@ namespace Client.Application.ViewModels
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)

View File

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

View File

@ -69,6 +69,11 @@ namespace Client.Application.ViewModels
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)
{
OnPropertyChanged("From");

View File

@ -38,6 +38,14 @@ namespace Client.Application.ViewModels
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)
{
if (e.PropertyName == "Hp")