【问题标题】:Fixing possible memory leak in RelayCommand修复 RelayCommand 中可能存在的内存泄漏
【发布时间】:2015-01-26 06:02:14
【问题描述】:

使用内存分析器并比较快照,我们发现 150 多个 RelayCommand 类型的对象在快照之间存活而不是被释放。

RelayCommand 在快照之间注册,然后取消注册。

注销过程是否完成?

还有其他与RelayCommand相关的资源要释放吗?

中继命令代码:

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
}

【问题讨论】:

    标签: c# wpf memory-leaks prism


    【解决方案1】:

    RequerySuggested 持有弱引用并且不会阻止对象被释放,因此它不是问题的根源。如果内存影响不可接受,请尽量减少创建的命令实例的数量。

    【讨论】:

    • DelegateCommand 和 CompositeCommand 的 PRISM 实现有一个“私有列表 _canExecuteChangedHandlers;”。在这种情况下需要吗?
    • 确实需要,但是在没有更多强引用的情况下让命令的订阅者被释放。同样,您的实施没有任何问题。在 GC 释放未使用的命令之前会有一些自然延迟。影响有多大?它不应该消耗太多内存 - RelayCommand 很小。
    猜你喜欢
    • 2015-05-22
    • 2012-01-12
    • 2011-07-18
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2013-07-29
    • 2017-07-29
    相关资源
    最近更新 更多