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
                        C#-Quelltext                    
           	 										| 1:2:
 3:
 4:
 
 | var watch = Stopwatch.StartNew();
 while (watch.ElapsedMilliseconds < 3000)
 Thread.Sleep(10);
 |