Reputation: 1362
Using a Memory profiler and comparing snapshots we realised 150+ objects of type RelayCommand were surviving between the snapshots instead of being released.
The RelayCommand is registered and then unregistered between the snapshots.
Is the unregistration process complete?
Are there other resources related to the RelayCommand to be released?
RelayCommand code:
public class RelayCommand : ICommand
{
#region Fields
readonly Action<object> _execute;
readonly Predicate<object> _canExecute;
#endregion // Fields
#region Constructors
/// <summary>
/// Creates a new command that can always execute.
/// </summary>
/// <param name="execute">The execution logic.</param>
public RelayCommand(Action<object> execute)
: this(execute, null)
{
}
/// <summary>
/// Creates a new command.
/// </summary>
/// <param name="execute">The execution logic.</param>
/// <param name="canExecute">The execution status logic.</param>
public RelayCommand(Action<object> execute, Predicate<object> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");
_execute = execute;
_canExecute = canExecute;
}
#endregion // Constructors
#region ICommand Members
[DebuggerStepThrough]
public bool CanExecute(object parameter)
{
return _canExecute == null ? true : _canExecute(parameter);
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter)
{
this._execute(parameter);
}
#endregion // ICommand Members
}
Upvotes: 1
Views: 669
Reputation: 1574
RequerySuggested holds a weak reference and does not prevent an object from being released, so it's not a source of your problem. Try minimising the number of command instances created if the memory impact is unacceptable.
Upvotes: 1