Foreach onthouden waar hij gebleven was?

  • Onderwerp starter Onderwerp starter Zaro
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

Zaro

Gebruiker
Lid geworden
28 feb 2010
Berichten
33
Hallo,

Ik ben nu wel redelijk lang bezig met C#, en was bezig met het schrijven van een eigen void.
Mijn void heeft een foreach, de items zijn verschillende webpagina's.
Bij elke foreach uitgevoerd moet het programma wachten tot de webpagina geladen is. Daarna mag de volgende pagina geladen worden.

Ik heb nu dit: (ingekort)
Code:
            foreach (string s in result)
            {
                if (s.StartsWith("<"))
                {

                }
                else
                {
                    int index = s.IndexOf('"');
                    if (index > 0)
                    {
                                webBrowser1.Navigate(s.Substring(0, index));
                    }
                }
            }
Wanneer de webBrowser.Navigate(); is uitgevoerd, zal de foreach opnieuw beginnen.
Ik heb al met een global boolean gewerkt, dat wanneer de webBrowser1.Navigate() werd uitgevoerd er dit kwam:
Code:
                                webBrowser1.Navigate(s.Substring(0, index));
                                pagedoneloading = false;
En dan werd in de webbrowser.DocumentCompleted() deze waarde naar true gezet en mijn void weer aangeroepen.
Dan krijg je dit:
Code:
            while (webpagedoneloading == false)
            {
                Thread.Sleep(100); //Zou eigenlijk geen Thread.Sleep moeten gebruiken, maar is een applicatie voor mijzelf, dus het mag. :p
            }

            foreach (string s in result)
            {
                if (s.StartsWith("<"))
                {

                }
                else
                {
                    int index = s.IndexOf('"');
                    if (index > 0)
                    {
                                webBrowser1.Navigate(s.Substring(0, index));
                                webpagedoneloading = true;
                    }
                }
            }

Helaas, begint de foreach dan helemaal opnieuw, is er een mogelijkheid (met een Array + while?) om dit op te lossen?

Ik heb namelijk geen idee waar ik voor moest googelen.

Alvast bedankt :thumb:,
Rutger.
 
Laatst bewerkt:
In principe zou dat alleen moeten gebeuren als je de lus recursief aanroept. Indien je dit niet wilt moet je de bool zetten in de lus en zorgen dat je niet recursief aanroept, maar eerst de originele string afhandelt.
 
je zou het kunnen doen door middel van labels (wordt vaak afgeraden, je code wordt er ook slechter leesbaar door), maar het is een mogelijkheid:

[cpp]
public void DoSomething()
{
foreach (string x in var)
{
START:
IetsMoelijks(x);

if (x== iets anders)
{
goto START;
}
}
}
[/cpp]

misschien een beter voorbeeld: http://msdn.microsoft.com/en-us/library/13940fs2(v=vs.71).aspx
 
Laatst bewerkt:
Allebei erg bedankt!
Ik had werkelijk geen idee hoe ik dit moest aanpakken.
Die link van MSDN is erg handig! Ik heb wel eens op mijn rekenmachine geprogrammeerd, waar je ook de GOTO functie had, nooit geweten dat die ook in C# zat.

Erg bedankt! :thumb:
 
probeer het wel zo vaak mogelijk te vermijden, het is niet echt een nette manier vindt ik zelf. De flow van je programma wordt er niet duidelijker op. Soms is het echter wel handig dus gebruik het met mate =)
 
Bij elke foreach uitgevoerd moet het programma wachten tot de webpagina geladen is. Daarna mag de volgende pagina geladen worden.

Dan moet je die logica ook in je code hanteren. In je huidige code wordt alles binnen de foreach immers achter elkaar uitgevoerd.

[cpp]
foreach (string s in result)
{
if (s.StartsWith("<"))
{
}
else
{
int index = s.IndexOf('\"');

if (index != -1)
{
webpagedoneloading = false;
webBrowser1.Navigate(new Uri(s.Substring(0, index)));

while (webpagedoneloading == false) Thread.Sleep(100);
}
}
}

// DocumentCompleted
webpagedoneloading = true;
[/cpp]
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan