So fügen Sie einem WPF-Programm eine Verzögerung hinzu, ohne die Benutzeroberfläche zu blockieren

Ich baue einen Geräteemulator. Wenn es gestartet wird, dauert es einige Zeit, bis es initialisiert ist. Dies würde logischerweise dadurch dargestellt, dass es eingeschaltet wird und sofort in einen "Initialisierungs" -Zustand übergeht und nach einiger Zeit in einen "Bereit" -Zustand übergeht.

Ich verwende MVVM, daher wird das ViewModel vorerst die gesamte Gerätelogik darstellen. Jeder der möglichen Zustände verfügt über einen datengesteuerten Stil, der von der Ansicht gerendert werden soll. Wenn ich beim Erstellen des Ansichtsmodells nur den Status festgelegt habe, wird die Ansicht mit dem richtigen Erscheinungsbild gerendert.

Ich möchte einen "Timeout-Status" erstellen, dh, wenn ein Ereignis eintritt (Starten der Anwendung, Klicken auf eine bestimmte Schaltfläche), wechselt das Gerät für eine feste Zeit in einen Status und kehrt dann in den Status "Bereit" zurück ", oder" Ruhezustand ".

Ich habe darüber nachgedacht, Sleep zu verwenden, aber Sleep blockiert die Benutzeroberfläche (so heißt es). Also denke ich über die Verwendung von Threads nach, bin mir aber nicht sicher, wie ich das machen soll. Folgendes habe ich bisher:

using System.ComponentModel;

namespace EmuladorMiotool {
    public class MiotoolViewModel : INotifyPropertyChanged {
        Estados _estado;

        public Estados Estado {
          get {
              return _estado;
          }
          set {
              _estado = value;
              switch (_estado) {
                  case Estados.WirelessProcurando:
                      // WAIT FOR TWO SECONDS WITHOUT BLOCKING GUI
                      // It should look like the device is actually doing something
                      // (but not indeed, for now)
                      _estado = Estados.WirelessConectado;
                      break;
              }
              RaisePropertyChanged("Estado");
          }
        }

        public MiotoolViewModel() {
            // The constructor sets the initial state to "Searching"
            Estado = Estados.WirelessProcurando;
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void RaisePropertyChanged(string propertyName) {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
                handler(this, new PropertyChangedEventArgs(propertyName));
        }

    }

    public enum Estados {
        UsbOcioso,
        UsbAquisitando,
        UsbTransferindo,
        WirelessNãoPareado,
        WirelessPareado,
        WirelessDesconectado,
        WirelessProcurando,
        WirelessConectado,
        WirelessAquisitando,
        DataLoggerOcioso,
        DataLoggerAquisitando,
        Erro,
        Formatando
    }
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage