2016-11-30 209 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(); 
} 
相關問題