Laden...

Async/Await "freeze"

Erstellt von BL4CKM4MB4 vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.359 Views
B
BL4CKM4MB4 Themenstarter:in
2 Beiträge seit 2017
vor 6 Jahren
Async/Await "freeze"

Guten Tag,

folgendes zur Situation: Ich möchte gleich zu Beginn anmerken, dass ich relativ neu in der Marterie bin, speziell bei Threads.
Über ein "Cefsharp-Control-Webbrowser-Element" wird nun ein Script abgeschickt. Um das zu tun, muss gewährleistet sein, dass das Browser-Control bereits initialisiert ist und keine Daten geladen werden.

Die Variablen "bool IsBusy, IsBrowserInitialized;" werden im Laufe der Prozedur auf die erforderlichen Werte gesetzt, um die while-Schleife verlassen zu können.


private void Form1_Load(object sender, EventArgs e)
        {
           if(performLogin().Result)
           {
              Console.WriteLine("Login DONE!");
           }
        }
 private async Task<bool> performLogin()
        {
            await waitTillReadyState();
            //Performs login and returns TRUE if successfull
            string script = "document.getElementById('login_server').value=" + '\'' + loginData.Server  + "\';" +
                            "document.getElementById('login_user').value="   + '\'' + loginData.Uid     + "\';" +
                            "document.getElementById('login_pass').value="   + '\'' + loginData.Pw      + "\';" +
                            "document.getElementById('submitlogin').click();";
            chromeBrowser.GetMainFrame().ExecuteJavaScriptAsync(script);

            return true; //just for debugging..
        }
        
private async Task waitTillReadyState()
        {
            bool succeeded = false;

            while (!succeeded)
            {
                succeeded = !IsBusy && IsBrowserInitialized; // if it worked, make as succeeded, else retry
                await Task.Delay(200); // arbitrary delay
            }
        }

Bedauerlicherweise generiert mir dieser Code einen Aufhänger und es ist mir leider kein Begriff was die Ursache sein kann.

D
985 Beiträge seit 2014
vor 6 Jahren

Task.Result oder auch Task.Wait (was intern durch Task.Result aufgerufen wird) blockiert den aktuellen Thread.

Wer async sagt muss auch await sagen!

Darum


private async void Form1_Load(object sender, EventArgs e)
        {
           if(await performLogin())
           {
              Console.WriteLine("Login DONE!");
           }
        }

Das waitTillReadyState kann man schöner und sauberer mit TaskCompletionSource lösen. Einfach mal nach Beispielen suchen.

B
BL4CKM4MB4 Themenstarter:in
2 Beiträge seit 2017
vor 6 Jahren

Danke für die Aufklärung und den Tipp mit der TaskCompletionSource. Problem solved!