Entwickler-Ecke
C# - Die Sprache - zeitgesteuerter exit aus while-schleife
Trombone - Sa 08.10.11 02:58
Titel: zeitgesteuerter exit aus while-schleife
Moin moin,
ich benötige einen Ausstieg aus einer While schleife, wenn diese nicht durch ihre ursprüngliche Aufgabe beendet wird.
Dazu habe ich mir folgendes überlegt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| bool exit = false
DateTime maxTime = new DateTime(); maxTime = DateTime.Now; maxTime.Add(new TimeSpan(0,0,30));
while(!exit) { try{ DateTime currentTime = new DateTime(); currentTime = DateTime.Now; if(DateTime.Compare(maxTime,currentTime)<0) { exit = true; } exit = true; } catch{} } |
Eigendlich sollte der code die Schleife 30 Sekunden nach dem Startzeitpunkt beenden,
leider funktioniert das nicht so wie ich mir das vorgestellt habe...
Die schleife läuft jedes maö in den Block der If bedingung und das schon deutlich eher.
Hat jemand ne idee was ich falsch mache? Gibts ne elegantere Lösung?
Würd mich über Rat freuen!
jaenicke - Sa 08.10.11 06:57
Schau dir einmal dieses Beispiel an:
http://msdn.microsoft.com/de-de/library/system.datetime.ticks.aspx
Das Entscheidende davon für dich:
C#-Quelltext
1: 2: 3: 4: 5:
| long elapsedTicks = currentDate.Ticks - centuryBegin.Ticks; TimeSpan elapsedSpan = new TimeSpan(elapsedTicks);
[...] Console.WriteLine(" {0:N2} seconds", elapsedSpan.TotalSeconds); |
Auf diese Weise kannst du die vergangenen Sekunden direkt prüfen.
Th69 - Sa 08.10.11 10:18
Hallo Trombone,
dein eigentlicher Fehler ist diese Zeile
C#-Quelltext
1:
| maxTime.Add(new TimeSpan(0,0,30)); |
Diese bewirkt bei dir gar nichts, da diese Methode ein neues DateTime-Objekt zurückgibt (und nicht die aktuelle Instanz verändert - dies gilt für alle Methoden der DateTime-Struktur).
Richtig wäre also
C#-Quelltext
1:
| maxTime = maxTime.Add(new TimeSpan(0,0,30)); |
Und noch ein Tipp:
du brauchst nicht zuerst ein DateTime-Objekt mit "new" erstellen um es in der nächsten Zeile wieder mit einem neuen Wert zu überschreiben. Dies kannst du gleich in einer Zeile machen:
C#-Quelltext
1:
| DateTime maxTime = DateTime.Now; |
Trombone - So 09.10.11 18:03
Danke für die Hilfe, nun gehts:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| bool folderCreated = false;
DateTime startTime = DateTime.Now;
while (!folderCreated) { try { DateTime currentTime = DateTime.Now; if (currentTime.Ticks - startTime.Ticks > 50000000) { MessageBox.Show("bla");
folderCreated = true; }
folderCreated = true;
} catch { } } |
C# - So 09.10.11 19:17
Hm. Das kannst du doch mit
Stopwatch leichter machen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| using System.Diagnostics;
Stopwatch timer = new Stopwatch(); bool folderCreated = false; timer.Start(); while (!folderCreated) { try { if (timer.ElapsedMilliseconds > 5000) { MessageBox.Show("bla");
folderCreated = true; }
folderCreated = true;
} catch { } } timer.Reset(); |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!