Dein Problem ist, dass die while-Schleife nicht wirklich läuft.
Die fragt in der Bedingung immer einmal nach einem Tastendruck.
Dein Code würde wahrscheinlich funktionieren, wenn Du immer eine andere Taste drückst - nicht die Enter-Taste.
Wenn Du dieses Verhalten nicht haben willst, brauchst Du einen zweiten Thread, der die while-Schleife ausführt.
Die Main-Thread teilt dem zweiten Thread dann mit, dass er sich beenden soll.
Ein paar Suchbegriffe dazu: Task, async, await, CancellationToken
Aber ein Tipp wegen deinem Versuch mit Environment.TickCount:
Stopwatch
Die Klasse ist eine Stopuhr, die macht genau das, was Du haben willst: Zeit messen
C#-Quelltext
1: 2: 3: 4:
| var watch = Stopwatch.StartNew();
while (watch.ElapsedMilliseconds < 3000) Thread.Sleep(10); |