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;
       // MessageBox...
     }
    // try something
    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;

            // Wait max. 5 seconds 

            while (!folderCreated)
            {
                try
                {
                    DateTime currentTime = DateTime.Now;
                    
                    if (currentTime.Ticks - startTime.Ticks > 50000000)
                    {
                        MessageBox.Show("bla");

                        folderCreated = true;
                    }

       
                 // try something
                 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//kannst du dir übrigens schenken, der Standartwert von bool ist immer false

            // Wait max. 5 seconds 
timer.Start();
            while (!folderCreated)
            {
                try
                {                    
                    if (timer.ElapsedMilliseconds > 5000//das sind 5 Sekunden "50000000" sind ca. 840 Minuten
                    {
                        MessageBox.Show("bla");

                        folderCreated = true;
                    }

       
                 // try something
                 folderCreated = true;

                }
                catch
                {
                }
            }
timer.Reset(); //Stoppt die Stoppuhr und setzt sie wieder auf 0