Ranjith Venkatesh
Ranjith Venkatesh

Reputation: 1362

Fixing possible memory leak in RelayCommand

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

Answers (1)

Maxim Balaganskiy
Maxim Balaganskiy

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

Related Questions