Backgroundworker voor paswoordcontrole, worker.IsBusy werkt niet

Status
Niet open voor verdere reacties.

tinav

Gebruiker
Lid geworden
13 mrt 2015
Berichten
10
Hallo,

Via een formulier laat ik een paswoord invullen en in de main class wil ik, mbv een bw controleren of het correct is, en daarna al dan niet een paar taken laten uitvoeren. De code hieronder werkt zolang de while (worker.IsBusy) er niet bij staat (anders blokkeert het formulier), maar dan wordt setAdminProperties(); tegelijk met de bw uitgevoerd en dus niet erna wanneer de gebruiker is ingelogd als admin. Een gelijkaardige setup heb ik eerder in het programma ook gebruikt en daar werkt de while (worker.IsBusy) en de code die erna staat prima. Nog even dit: ik heb een paar if-statements weggelaten om de code hier wat korter te houden.

De vraag is dus: waarom zorgt while (worker.IsBusy) voor problemen?


Code:
private void accessAdminLogin_Click(object sender2, RoutedEventArgs e)
 {
            adminlogin = new LoginForm(); // create login form     

            BackgroundWorker worker = new BackgroundWorker();
            worker.DoWork += (sender, args) =>
            {
                while (!_isLoggedIn) // check password as long as not logged in
                {
                    while (!adminlogin.checkInput) {Thread.Sleep(100);} // is set to true when OK button is clicked
                    
                    if (adminlogin.password == "ok" && adminlogin.username == "ok") // password and username are set when OK button is clicked
                    {
                        _isLoggedIn = true;                                            
                        MessageBox.Show("You are logged in as Adminstrator.");    
                    }    
                    else
                    {
                        MessageBox.Show("You entered a wrong password or username.");
                        adminlogin.checkInput = false; // a new input is necessary before password is checked again (see thread.sleep above)
                    }
                }
            };
            worker.RunWorkerAsync();

            while (worker.IsBusy)
            {
                if (_isLoggedIn) worker.CancelAsync();
            }

            setAdminProperties();
           }
 }
 
Door de while loop blijft het programma vast hangen als het controleren lang duurt.

Je kunt ook op het RunWorkerCompleted event registreren en daar de admin properties setten. (en form controls wijzigen)

(in DoWork kun je e.Result setten en deze waarde in RunWorkerCompleted gebruiken zoals een bool of login successful was of een gebruiker class)
 
Het formulier blokkeert al bij opstart. Is dit omdat het programma onmiddellijk herkent aan de code binnen de DoWork functie dat de loop wel eens lang zou kunnen duren?

Is het beter om de bw in de method/class te zetten waar het formulier wordt aangemaakt (zoals het nu is) of is het beter de bw direct in de klasse van het formulier te zetten? Of is hier geen algemene werkwijze rond?
 
Bij het opstarten is er nog niet op de accessAdminLogin button geklikt toch, dus zal de code nog niet actief zijn. (mogelijk blokkeert er iets anders?)
Dit: while (!adminlogin.checkInput) {Thread.Sleep(100);} zou ik ook vermijden, thread sleep is ook iets wat blokkeert.

Zelf zou ik een class maken die alle authenticatie doet en deze class gebruiken in je loginform. (zo min mogelijk code in je code-behind document).
 
Sorry voor de verwarring, ik bedoelde het opstarten van het formulier. Ik heb RunWorkerCompleted gebruikt en alles werkt nu zoals het hoort. Ik zal de thread.sleep ook nog proberen te verwijderen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan