Laden...

Pause in einer For Schleife

Erstellt von Lumpi2001 vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.906 Views
L
Lumpi2001 Themenstarter:in
32 Beiträge seit 2007
vor 16 Jahren
Pause in einer For Schleife

Hallo

ich habe eine Schleife in die ich eine Pause einbringen, damit die schritte nicht zu schnell hintereinander abgearbeitet werden, ein 30 sec takt zb.

gibt es die möglichkeit so etwas in eine schleife einzubauen, und womit?

M
253 Beiträge seit 2006
vor 16 Jahren

> System.Threading.Thread.Sleep

mfg

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Lumpi2001,

Thread.Sleep

Aber beachte [FAQ] Warum blockiert mein GUI?

Unter Umständen ist ein Timer besser geeignet.

herbivore

L
Lumpi2001 Themenstarter:in
32 Beiträge seit 2007
vor 16 Jahren

Setzt dieser Thread Punkt noch weitere sachen vorraus ?

bei mir übergeht der einfach den thread bei 60000 🙁

Sollte noch erwähnen das ich eine Webanwendung habe.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Lumpi2001,

ohne Code und weitere Details werden dir wir wohl nicht helfen können.

herbivore

L
Lumpi2001 Themenstarter:in
32 Beiträge seit 2007
vor 16 Jahren

ok sorry,

also ich füre s in folgendem typ aus


public void WriteIt()
		{
		//Erzeugen von Instanzen für City und Url[/PHP]

die schleife befindet sich ca hier

				for (int i = 2; i < 10; i++)
				{
					
					
				//Versuch die Vorwahl einer Website auszulesen
					try
					{
					//Ausgabe der zuvor ermittelten Werte
						Response.Write("Nummer: " + i);
						Response.Write("<br /> Ort: " + mListeCity[i]);
						Response.Write("<br /> URL: " + mListeUrl[i]);
						Response.Write("<br /> Vorwahlen: ");
					
					//Erzeugen der Vorwahlen zu jeweiligen URL
						ReadoutNumbers mclassNumbers = new ReadoutNumbers(mListeUrl[i].ToString());
					
					//Abfrage der Lise der Vorwahlen
						ArrayList mListeNumbers = mclassNumbers.Numbers;
					
					//Definieren der Menge an Einträgen einer Liste
						int liMengeNumbers = mListeNumbers.Count;

					//Schreiben der Nummern unter die Website
						for (int j = 0; j < liMengeNumbers; j++)
						{
							Response.Write(mListeNumbers[j]);
							Response.Write(";");
						}
						Response.Write("<br /><br />");
					}
				//Bei Misserfolg, ausgabe eines Errors
					catch
					{
						Response.Write("ERROR");
						Response.Write("<br /><br />");
					}
					Thread.Sleep(60000);
				}

Ich lese bei dieser geschcihte eine webseite mit hilfe einer klasse aus, immer wieder eine andere Site auf der selben Page, und beim zweiten einlesen krieg ich keine antwort mehr vom webserver, daher dachte ich bring ich ne pause rein.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Lumpi2001,

ich denke, das hat nichts mit der Pause zu tun.

Verstehen tue ich den Code allerdings nicht ganz. Wo ist denn die Stelle, wo die WebSeite gelesen wird?

herbivore

L
Lumpi2001 Themenstarter:in
32 Beiträge seit 2007
vor 16 Jahren

Hallo,

sorry das ich jetzt erst Antworte aber war im Urlaub.

das auslesen der Website selber findet in einer externen Klasse statt.

Das Pause problem habe ich so gelöst

//Pause von ca 1000 Sekunden durch While Schleife durch auslesen und prüfen des Datumes.
					do
					{
						ldateAktuell = DateTime.Now;
					}
					while ( DiffSeconds(ldateKriterium, ldateAktuell) <= 1000 );

Es ist zwar nicht sauber, aber erfüllt seinen Zweck.

Problem ist nur, es ist nicht der Verursacher meines eigentlichen Problemes, den egal wie schnell, langsam ich die einzelnen Seiten auslese, es gibt immer wieder nach dem 3ten Datensatz ein Problem.

Darum werd ich wohl nochmal einen neuen Thread starten müssen.

Aber danke euch nochmal.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Lumpi2001,

Es ist zwar nicht sauber, aber erfüllt seinen Zweck.

auch wenn du schon selber sagst, dass das nicht sauber ist, muss ich - auch für andere Leser dieses Threads - noch einen drauf setzen und sagen: das ist nicht nur unsauber, sonder richtig großer Mist. Sollte man auf keinen Fall so machen. Es ist auch nicht nötig. Mit Timern bekommt man das sehr viel besser und einfacher hin.

herbivore

L
Lumpi2001 Themenstarter:in
32 Beiträge seit 2007
vor 16 Jahren

Okey danke für den Hinweiß.

da es wie gesagt allerdings nicht mein Problem löst, habe ich es auch bereits wieder entfernt.

L
Lumpi2001 Themenstarter:in
32 Beiträge seit 2007
vor 16 Jahren

Ok ich weiß nicht ob es sich jetzt Lohnt, quasi als kleinen Tip noch nen Thread aufzumachen oder ob ich kurz den Fehler beschreibe und wie ich Ihn gelösst habe.

Darum schreib ich es erstmal hier rein.

Also das Generelle Problem war, das ich aus einer Linkseite jede Seite hinter einem ink auslesen musste, und gleichbleibende Informationen via Regex aus der jeweiligen Seite auslesen musste.

hierzu habe ich folgenden Code genutzt.

	public class htmlind
	{

		private string lsHtmlContent;
		private string lsErrorCode;
		private DateTime ldScrapTime;


		public htmlind(string lsUrl)
		{
			WebRequest WebReq = WebRequest.Create(lsUrl);
			WebResponse WebResp = WebReq.GetResponse();
			StringBuilder myBuildContent = new StringBuilder();
			ldScrapTime = DateTime.Now;
			lsErrorCode ="";
			try
			{
				StreamReader myStreamR = new 
					StreamReader(WebResp.GetResponseStream(), 
					System.Text.Encoding.UTF7);                   
				while (-1 != myStreamR.Peek())
				{
					myBuildContent.Append(myStreamR.ReadLine());
				}
			}
			catch (Exception e)
			{
				lsErrorCode = e.ToString();
			}
			lsHtmlContent = myBuildContent.ToString();
}

Mein Problem war jetzt, das nach dem zweiten Link, die hier aufgeführte Klasse den Webresponse nicht mehr ausführen konnte und mir nurnoch ein Error zurückwarf.

Ich bin davon ausgegangen, das dieses Problem auf Seiten der auszulesenden Website lag, und wollte durch den Timer die Zugriffe herabsetzen.

Tatsächlich lag das Problem allerdings an einem Speicherüberlauf der durch den Webresponse durchgeführt wurde, den bei jedem Abfragen wurden Daten in den Speicher geschaufelt aber nicht mehr geleert.

Deshalb habe ich noch folgenden Paramter hinzugefügt, um den Speicher nach jedem Vorgang auch wieder zu leeren.

WebResp.Close();
D
386 Beiträge seit 2007
vor 16 Jahren

Disclaimer: Ungetestet, einfach nur hier im Editor geaendert.
Warum nicht so? Geaendert hab ich hier nur, dass using() {} verwendet wird. Und mich wuerde interessieren ob das Peek von dir besser oder schlechter ist als diese Version.


public htmlind(string lsUrl) {
  WebRequest WebReq = WebRequest.Create(lsUrl);
  using (WebResponse WebResp = WebReq.GetResponse()) {
    StringBuilder myBuildContent = new StringBuilder();
    ldScrapTime = DateTime.Now;
    lsErrorCode ="";
    try {
      using (StreamReader myStreamR = new StreamReader(WebResp.GetResponseStream(),
                    System.Text.Encoding.UTF7)) {

        string line;
        while ((line = myStreamR.ReadLine()) != null)
        {
          myBuildContent.Append(line);
        }
      }
    } catch (Exception e) {
      lsErrorCode = e.ToString();
    }
    lsHtmlContent = myBuildContent.ToString();
  }
}

  // Kram hier
}

Pound for pound, plutonium is about as toxic as caffeine when eaten.

L
Lumpi2001 Themenstarter:in
32 Beiträge seit 2007
vor 16 Jahren

Okey, werde mal beide Lösungen mit einem Start und einem Enddate versehen und mal gucken wie die sich so machen.

bei 17.243 einträgen ist ein kleine geschwindigkeitsschub schon wünschenswert .

🙂

Also deine Lösung brauch schonmal 14 min

Komme bei meiner Lösung auch auf 14 min

Also da tut sich nichts .