Как добавить задержку в программу WPF без блокировки пользовательского интерфейса

Я создаю эмулятор устройства. Когда он запускается, требуется некоторое время для его инициализации. Это было бы логично представлено включением и немедленным переходом кИнициализация» состояние, и через некоторое время оно уходитГотовы" государство.

Я использую MVVM, поэтому ViewModel пока представляет всю логику устройства. Каждое из возможных состояний имеет стиль передачи данных, который будет отображаться представлением. Если я просто устанавливаю состояние при построении модели представления, представление отображается с правильным внешним видом.

Что я хочу сделать, это создатьсостояние тайм-аута "то есть, когда происходит какое-либо событие (запуск приложения, нажатие определенной кнопки), устройство переходит в состояние на фиксированное время, а затем возвращается к «готовы", или же "холостой ход» государство.

Я думал об использовании Sleep, но сон блокирует пользовательский интерфейс (так они говорят). Поэтому я думаю об использовании потоков, но я не уверен, как это сделать. Это то, что я получил до сих пор:

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