Ich habe ein serverseitiges Klickereignis auf einer ASP.NET WebForms-Website. In diesem Fall rufe ich eine Methode auf, die ihrerseits ihre asynchrone Partnermethode aufruft und .Wait()
zum Anruf hinzufügt.Unterschied zwischen dem Aufruf von .Wait() für eine asynchrone Methode und Task.Run(). Wait()
Diese Methode dann nach unten geht mehreren Ebenen (d.h., ruft eine andere Asynchron-Methode, die eine andere Async-Methode aufruft, und so weiter), und schließlich ruft eine Async Methode auf einem Objekt Httpclient. An diesem Punkt scheint der Faden in einem Kaninchenloch zu verschwinden; Die Methode ruft nie zurück.
Jetzt weiß ich, dass die asynchrone Reihe von Aufrufen wie erwartet funktioniert, da der gleiche Code auch von einem Web-API-Controller aufgerufen wird (die Controller-Methode ruft die asynchrone Version dieser ersten Methode auf, nicht die synchrone 'Partner'-Methode) , das vollständig async ist und wie erwartet zurückkehrt.
Also im Grunde habe ich so etwas wie diese, die nie
protected void btn_Click(object sender, EventArgs e)
> Class1.DoSomething()
> Class1.DoSomethingAsync.Wait()
...
> await ClassN.Authenticate()
{
await myHttpClient.PostAsync() // never returns
}
kehren versuchte ich habe .ConfigureAwait(false)
an dieser ersten Asynchron-Methode verwendet, aber ohne Erfolg.
Ich habe auch das, was tut Rückkehr
Task<IHttpActionResult> MyWebApiMethod()
> await Class1.DoSomethingAsync()
...
> await ClassN.Authenticate()
{
await myHttpClient.PostAsync() // does return
}
ich gefunden habe, dass ich die erste Version Arbeit machen kann, wenn ich es wie folgt ändern:
protected void btn_Click(object sender, EventArgs e)
> Class1.DoSomething()
> Task.Run(async() => await Class1.DoSomethingAsync()).Wait()
...
> await ClassN.Authenticate()
{
await myHttpClient.PostAsync()
}
Aber ich Ich weiß nicht warum.
Kann mir jemand erklären den Unterschied zwischen
Class1.DoSomethingAsync.Wait()
ruft und ruft
Task.Run(async() => await Class1.DoSomethingAsync()).Wait()
Warum verwenden Sie es nicht auf die richtige Weise? 'async void btn_Click' und' erwarten Class1.DoSomethingAsync() '? – user3185569
Verwenden Sie 'Task.Run' nicht mit bereits asynchronen Methoden, dies ist Verschwendung von Threads. Ändern Sie einfach die Signatur von 'button_click' eventhandler als @ user3185569 vorgeschlagen – Fabio
@ user3185569 - Ich hatte das nicht verwendet, weil mir nicht bewusst war, dass ich' _ync' auf serverseitigen WebForms-Ereignissen verwenden konnte. Danke, dass du mir das gezeigt hast. – awj