Cómo agregar un retraso a un programa WPF sin bloquear la interfaz de usuario

Estoy construyendo un emulador de dispositivos. Cuando comienza, tarda un tiempo en inicializarse. Esto se representaría lógicamente al activarse y pasar inmediatamente a un estado de "Inicialización", y después de algún tiempo pasa al estado "Listo".

Estoy usando MVVM, por lo que ViewModel representará por ahora toda la lógica del dispositivo. Cada uno de los estados posibles tiene un estilo de datatriggered para ser representado por la Vista. Si acabo de establecer el estado cuando compilo el modelo de vista, la vista se muestra con la apariencia correcta.

Lo que quiero hacer es crear un "estado de tiempo de espera", es decir, cuando ocurre algún evento (iniciando la aplicación, haciendo clic en un botón determinado), el dispositivo entra en un estado por un tiempo fijo y luego vuelve a "listo". Estado ", o" inactivo ".

Pensé en usar Sleep, pero sleep bloquea la interfaz de usuario (eso dicen). Así que pienso en usar Threads, pero no estoy seguro de cómo hacerlo. Esto es lo que tengo hasta ahora:

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta