# Start-Sleep

Das Cmdlet `Start-Sleep` pausiert die Ausführung eines Skripts oder einer Befehlssequenz für eine definierte Zeitspanne.

Es wird häufig verwendet, um:

- Wartezeiten einzubauen
- Prozesse zu synchronisieren
- Ressourcen zu schonen (z. B. bei Schleifen)

---

## 🔧 Syntax

```powershell
Start-Sleep [-Seconds] <Double> [<CommonParameters>]

Start-Sleep -Milliseconds <Int32> [<CommonParameters>]

```

---

## 📌 Parameter

### `-Seconds`

- **Typ:** `Double`
- **Pflicht:** Ja (wenn `-Milliseconds` nicht verwendet wird)
- Gibt die Wartezeit in Sekunden an
- Dezimalwerte sind erlaubt

```powershell
Start-Sleep -Seconds 2.5

```

---

### `-Milliseconds`

- **Typ:** `Int32`
- **Pflicht:** Ja (wenn `-Seconds` nicht verwendet wird)
- Gibt die Wartezeit in Millisekunden an

```powershell
Start-Sleep -Milliseconds 500

```

---

## ⚠️ Hinweise zur Verwendung

- `-Seconds` und `-Milliseconds` **dürfen nicht gleichzeitig verwendet werden**
- Während der Ausführung blockiert `Start-Sleep` den aktuellen Thread vollständig
- Es erfolgt **keine Hintergrundverarbeitung** während der Pause

---

## 📊 Verhalten

<table id="bkmrk-eigenschaft-beschrei"><thead><tr><th>Eigenschaft</th><th>Beschreibung</th></tr></thead><tbody><tr><td>Blockierend</td><td>Ja</td></tr><tr><td>Rückgabewert</td><td>Keiner</td></tr><tr><td>Thread-Verhalten</td><td>Aktueller Thread wird pausiert</td></tr><tr><td>Genauigkeit</td><td>Abhängig vom System-Timer</td></tr></tbody></table>

---

## 🧪 Beispiele

### Einfaches Warten

```powershell
Write-Host "Start"
Start-Sleep -Seconds 2
Write-Host "Ende"

```

---

### Verwendung in Schleifen

```powershell
for ($i = 1; $i -le 5; $i++) {
    Write-Host "Durchlauf $i"
    Start-Sleep -Seconds 1
}

```

---

### Kurze Pause in Millisekunden

```powershell
Start-Sleep -Milliseconds 200

```

---

### Dynamische Wartezeit

```powershell
$delay = 1.5
Start-Sleep -Seconds $delay

```

---

## ⚙️ Typische Anwendungsfälle

- Polling (z. B. auf Datei oder Prozess warten)
- Debugging (Abläufe verlangsamen)
- UI-Skripte (z. B. kurz warten, bis Controls geladen sind)
- API-Rate-Limiting

---

## ❗ Alternativen / Ergänzungen

### `[System.Threading.Thread]::Sleep()`

```powershell
[System.Threading.Thread]::Sleep(1000)

```

**Unterschiede:**

- Arbeitet nur mit Millisekunden
- Weniger PowerShell-idiomatisch
- Kein Support für `CommonParameters`

---

### `Start-Sleep` vs. `Start-Job`

<table id="bkmrk-szenario-empfehlung-"><thead><tr><th>Szenario</th><th>Empfehlung</th></tr></thead><tbody><tr><td>Einfaches Warten</td><td>`Start-Sleep`</td></tr><tr><td>Asynchrone Ausführung</td><td>`Start-Job`</td></tr><tr><td>UI-Responsiveness wichtig</td><td>Kein `Start-Sleep`</td></tr></tbody></table>

---

## 🚫 Typische Fehler

### 1. Beide Parameter gleichzeitig verwenden

```powershell
# ❌ Falsch
Start-Sleep -Seconds 1 -Milliseconds 500

```

---

### 2. UI einfrieren

```powershell
# ❌ Problematisch in WinForms/WPF
Start-Sleep -Seconds 5

```

➡️ Blockiert die UI komplett

---

### 3. Zu kurze Wartezeiten erwarten hohe Präzision

```powershell
Start-Sleep -Milliseconds 1

```

➡️ Systembedingt oft ungenau

---

## 🧠 Best Practices

- Für UI-Anwendungen besser Timer verwenden statt `Start-Sleep`
- In Schleifen immer bewusst einsetzen, um CPU-Last zu reduzieren
- Wartezeiten so kurz wie möglich halten
- Für präzise Zeitsteuerung ggf. andere Mechanismen nutzen

---

Wenn du das Ding in einer WinForms-App benutzt, dann frierst du dir halt elegant dein UI ein und wunderst dich danach, warum alles tot wirkt. Klassischer Anfänger-Move, aber immerhin ein lehrreicher.