2016-11-30 1 views
4

Ich habe eine Anwendung in WPF mit dem MVVM-Muster erstellt.WPF exe läuft sehr langsam im Vergleich zur Ausführung in Visual Studio

Die Anwendung läuft gut im Visual Studio-Debugger, aber wenn ich die Exe aus dem Debug/Release-Ordner ausführen, wird es sehr langsam.

Hier meine RelayCommand Klasse:

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; 
    } 
} 

Wenn ich die CanExcecute() Methode aus meiner RelayCommand Klasse entfernen, dann läuft die exe-Version als normal.

Bitte kann jemand erklären, warum dieses Ding passiert? Handelt es sich um den Ereignishandler CanExecuteChanged?

+0

Schwer zu sagen, wir wissen nicht, welche Art von Logik, die Sie in CanExecute laufen. Erstellen Sie eine [MCVE] –

+0

@HenkHolterman Ich überprüfe eine Eigenschaft aus der Datenbank, ich denke, dass das Abrufen das Problem ist. Wenn ich nur wahr von dieser CanExcecute-Methode zurückgebe, funktioniert die Exe einwandfrei. – sushmitgos

+0

Wenn ich einfach Sammlung ohne db abrufen bin, funktioniert es gut :) – sushmitgos

Antwort

1

Sie haben zwei Möglichkeiten:

  1. die CommandManager.RequerySuggested Ereignis nicht Verwenden.

Die aktuelle Implementierung des CommandManager reiht einen requery aller Befehle als Dispatcher Aktion mit einem DispatcherPriority.Background. Das bedeutet, dass die CommandManager die CommandManager Methoden aller Befehle, die Sie in der 10 registriert haben, ruft, wenn Ihre Anwendung inaktiv ist. Wenn eine dieser Methoden einige Ressourcen verbraucht (z. B. die Verwendung einer Datenbank oder das Lesen einer Datei), werden Sie wahrscheinlich den allgemeinen Leistungsabfall Ihrer Anwendung bemerken.

z. Prism hat eine eigene Implementierung des ICommand ohne das Ereignis CommandManager zu abonnieren. Das funktioniert auch gut, aber Sie müssen die Methoden RaiseCanExecuteChanged() explizit aufrufen, wenn Sie den Befehlszustand aktualisieren möchten. Dies ist normalerweise kein Problem, da Sie nur an einigen Befehlen gleichzeitig interessiert sein sollten, nicht an allen Befehlen in Ihrer Anwendung.

  1. Verwenden Sie keine schwergewichtigen Aufgaben in Ihren CanExecute() Methoden.

Sie sollten so sein, kurz und schnell:

public bool CanExecute() 
{ 
    return this.isIdle && this.someFlag && !this.CommandAbort.CanExecute(); 
} 
Verwandte Themen