Wiederum ein sync-Methode in einer asynchronen one
Ich versuche, die wiederum eine synchrone Methode, die von einigen alten code in eine asynchrone Methode, aber ich habe einige Schwierigkeiten zu verstehen. Von all den videos und tutorials, die ich gelesen habe scheinen Sie zu sein, die Schaffung von zwei Methoden: eine, die eigentliche Funktion, das andere eine wrapper und dann ist der wrapper aufgerufen auf der Benutzeroberfläche.
Hier ist mein code:
private async Task<bool> login(String username, String password)
{
var tcs = new TaskCompletionSource<RestSharp.IRestResponse>();
RestSharp.RestRequest request = new RestSharp.RestRequest("/accounts/login/", RestSharp.Method.GET);
RestSharp.IRestResponse response = client.Execute(request);
//Make the login request
request = new RestSharp.RestRequest("/accounts/login/", RestSharp.Method.POST);
request.AddParameter("username", username);
request.AddParameter("password", password);
response = client.Execute(request);
//Return loggin status
dom = response.Content;
return dom["html"].HasClass("logged-in");
}
Aus irgendeinem Grund, wenn ich versuche, rufen Sie die Methode auf dem UI-thread aus klicken auf eine Schaltfläche, es fragt mich, um das button-Ereignis async
.
txtLog.AppendText("Before Await");
Task<bool> result = await login("","");
txtLog.AppendText("After Await");
txtLog.AppendText("Result: " + result.toString());
Brauche ich eine wrapper-Methode, die auch async
was macht der Aufruf zum login?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zur Beantwortung Ihrer 2. Teil zuerst, ja Sie müssen, markieren Sie das Ereignis für die Schaltfläche
async
wenn Sie möchten, verwenden Sie das Schlüsselwortawait
in Ihrem code, müssen Sie die Funktion deklarierenasync
.2ndly wenn eine Funktion verwendet
async
ohne einawait
im inneren wird der code nicht ausgeführt werden asynchron sind, müssen Sie entweder eine Aufgabe erstellen und ausführen der synchronen Methode innerhalb es oder ändern Sie die Methode asynchron.Als task-Methode:
Umschreiben der Funktion, Methode:
In meine "rewrite Methode" was ich Tue, ist, ich bin mit
ExecuteAsync
Hexe ist Teil IRestClient. Die Funktion ruft eine callback Methode auf, wenn es abgeschlossen ist, wird in der callback-Methode, die ich nennentcs
'sSetResult
zu berichten, das Ergebnis wollte ich.Könnten Sie dies gilt es weiter auszubauen, indem Sie in einem
CancellationToken
und wenn das token ausgelöst nennenAbort()
aufRestRequestAsyncHandle
aber wenn wir dies tun, wir brauchen, um dieasync
wieder in die Funktion ein und warten Sie das Ergebnis, damit wir Aufräumen können nach der Absage von token-Anmeldung.Ihre button-handler den
await
Stichwort, was bedeutet, dass es gemacht werdenasync
. Dieawait
keyword im Grunde Partitionen der Methode aufawait
, drehen Sie das Teil nach derawait
in ein Delegat, der fortgesetzt wird, wenn das erwarteteTask
abgeschlossen. Die Methode kehrt sofort nach der Begegnung mit demawait
.Ihre login-Funktion nicht verwenden
await
. Es muss nicht dieasync
Stichwort.