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.
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.
Danke für die Aufklärung und den Tipp mit der TaskCompletionSource
. Problem solved!