2016-11-30 163 views
4

我已经使用MVVM模式在WPF中创建了一个应用程序。与在Visual Studio中运行相比,WPF EXE运行速度非常慢

该应用程序在Visual Studio调试器中运行良好,但是当我从调试/释放文件夹运行该exe时,它变得非常缓慢。

这里是我RelayCommand类:

public class RelayCommand : ICommand 
{ 
    private readonly Action<object> execute; 
    private readonly Predicate<object> canExecute; 

    public RelayCommand(Action<object> execute) : this(execute, DefaultCanExecute) 
    { 
    } 

    public RelayCommand(Action<object> execute, Predicate<object> canExecute) 
    { 
     this.execute = execute; 
     this.canExecute = canExecute; 
    } 

    public event EventHandler CanExecuteChanged 
    { 
     add 
     { 
      CommandManager.RequerySuggested += value; 
     } 

     remove 
     { 
      CommandManager.RequerySuggested -= value; 
     } 
    } 

    [DebuggerStepThrough] 
    public bool CanExecute(object parameter) 
    { 
     bool res = false; 
     if (canExecute != null) 
     { 
      res = canExecute(parameter); 
     } 

     return res; 
    } 

    public void Execute(object parameter) 
    { 
     execute(parameter); 
    } 

    private static bool DefaultCanExecute(object parameter) 
    { 
     return true; 
    } 
} 

如果我从我的RelayCommand类别中删除CanExcecute()方法,那么EXE版本的运行是正常的。

请任何人都可以解释为什么这件事情发生?是否为CanExecuteChanged事件处理程序?

+0

很难说,我们不知道你在CanExecute运行什么样的逻辑。创建一个[MCVE] –

+0

@HenkHolterman我正在检查数据库的一些属性,我认为提取是问题。如果我只是从该CanExcecute方法返回true,该exe工作正常。 – sushmitgos

+0

如果我只是迭代抛出集合而不提取数据库它工作正常:) – sushmitgos

回答

1

你有两个选择:

  1. 不要使用CommandManager.RequerySuggested事件。

的当前实现CommandManager的入队的所有命令为Dispatcher行动,DispatcherPriority.Background的重新查询。这意味着,只要您的应用程序处于空闲状态,CommandManager就会调用您在CommandManager中注册的所有命令的CanExecute()方法。如果这些方法中的任何一个消耗了一些资源(如使用数据库或读取文件),那么您可能会注意到应用程序的整体性能下降。

E.g.棱镜有自己的执行ICommand没有订阅CommandManager的事件。这也很好,但是当你想更新命令状态时,你必须明确地调用RaiseCanExecuteChanged()方法。这通常不是问题,因为您应该只对一些命令感兴趣,而不是对应用程序中的所有命令感兴趣。

  1. 请勿在CanExecute()方法中使用任何重量级任务。

他们应该是这个样子,短而快:

public bool CanExecute() 
{ 
    return this.isIdle && this.someFlag && !this.CommandAbort.CanExecute(); 
} 
相关问题