[c#] "Wachten" op event

Pagina: 1
Acties:

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Ik ben bezig met een simpel programmatjes wat wat acties op een web-pagina automatiseerd zoals het inloggen.

Ik heb een Controller Class gemaakt die wat dingen doet. Zo heb ik bijvoorbeeld een login method die ongeveer het volgende doet.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void Login()
{
    browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(LoginDocumentHandler);
    browser.Navigate(new Uri(server + "login.php"));
}

void LoginDocumentHandler(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    foreach (HtmlElement el in browser.Document.GetElementsByTagName("input"))
    {
        if (el.Name.ToLower().StartsWith("name"))
        {
            el.SetAttribute("value", username);
        }
        if (el.Name.ToLower().StartsWith("pw"))
        {
            el.SetAttribute("value", password);
        }
    }
    browser.Document.Forms[0].InvokeMember("submit");
}

Maar wat ik eigenlijk wil is dat de Login method pas returnt als het inloggen ( De event handler ) echt is uitgevoerd.
Het is natuurlijk niet echt een mogenlijkheid om gewoon een sleep te doen en te wachten totdat de handler echt is uigevoerd want het event wordt waarschijnlijk in dezelfde Thread getriggerd.
Eigenlijk zou ik iets willen van een BackgroundWorker die ik start in login en dat ik daarna meteen iets van worker.Wait(); doe. De worker kan daarna alle belangrijke dingen uitvoeren en pas exiten op het moment dat het form gesubmit is.

Ik kan nou alleen even niet echt een nette manier bedenken om dit te realiseren dus ik hoopte dat jullie wat ideen voor mij hebben.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Eigenlijk heel simpel en eigenlijk niet zo heel mooi:
C#:
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
30
private bool m_LoginContinue;
public void Login()
{
    browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(LoginDocumentHandler);
    browser.Navigate(new Uri(server + "login.php"));

    // Wachten zolang het event nog niet klaar is
    while(!this.m_LoginContinue) {
        Thread.Sleep(500);
    }
}

void LoginDocumentHandler(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    foreach (HtmlElement el in browser.Document.GetElementsByTagName("input"))
    {
        if (el.Name.ToLower().StartsWith("name"))
        {
            el.SetAttribute("value", username);
        }
        if (el.Name.ToLower().StartsWith("pw"))
        {
            el.SetAttribute("value", password);
        }
    }
    browser.Document.Forms[0].InvokeMember("submit");

    // event klaar, aanroepende functie kan dus verder
    this.m_LoginContinue = true;
}

Nu met Land Rover Series 3 en Defender 90


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 19-02 14:18

pjvandesande

GC.Collect(head);

Hier hebben we toch gewoon WaitHandles voor like ManualResetEvent.

C#:
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
private ManualResetEvent _loggedIn = new ManualResetEvent( false );
public void Login()
{
    browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(LoginDocumentHandler);
    browser.Navigate(new Uri(server + "login.php"));

    // Wachten zolang het event nog niet klaar is
    _loggedIn.WaitOne();
    _loggedIn.Reset();
}

void LoginDocumentHandler(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    foreach (HtmlElement el in browser.Document.GetElementsByTagName("input"))
    {
        if (el.Name.ToLower().StartsWith("name"))
        {
            el.SetAttribute("value", username);
        }
        if (el.Name.ToLower().StartsWith("pw"))
        {
            el.SetAttribute("value", password);
        }
    }
    browser.Document.Forms[0].InvokeMember("submit");

    _loggedIn.Set();
}

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
@MTWZZ
Ja dat bedoelde ik in mij start post ook. Maar dat is natuurlijk totaal niet handig.

@questa
Ja zoiets bedoelde ik. Ik zal er eens naar gaan kijken naar die ManualResetEvent.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”