Ich hatte kürzlich eine Situation, in der ich einen ASP.NET-WebAPI-Controller hatte, der innerhalb seiner Aktionsmethode zwei Webanforderungen an einen anderen REST-Service ausführen musste. Ich hatte meinen Code geschrieben Funktionalität sauber in separate Verfahren getrennt zu haben, die ein wenig wie in diesem Beispiel sah:Wie funktioniert die async/await Callchain?
public class FooController : ApiController
{
public IHttpActionResult Post(string value)
{
var results = PerformWebRequests();
// Do something else here...
}
private IEnumerable<string> PerformWebRequests()
{
var result1 = PerformWebRequest("service1/api/foo");
var result = PerformWebRequest("service2/api/foo");
return new string[] { result1, result2 };
}
private string PerformWebRequest(string api)
{
using (HttpClient client = new HttpClient())
{
// Call other web API and return value here...
}
}
}
Weil ich wurde mit HttpClient
alle Web-Anfragen hatte async sein. Ich habe noch nie Async/Abwarten verwendet, also fing ich an, naiv die Keywords hinzuzufügen. Zuerst habe ich das async
Schlüsselwort der PerformWebRequest(string api)
Methode hinzugefügt, aber dann beschwerte sich der Anrufer, dass die PerformWebRequests()
Methode async
auch sein muss, um await
zu verwenden. Also habe ich das gemacht async
aber jetzt muss der Aufrufer dieser Methode async
auch sein, und so weiter.
Was ich wissen möchte ist, wie weit unten im Kaninchenloch alles markiert sein muss async
um einfach zu arbeiten? Sicher würde es einen Punkt geben, an dem etwas synchron laufen muss, wie wird das dann sicher gehandhabt? Ich habe bereits gelesen, dass das Aufrufen von Task.Result
eine schlechte Idee ist, weil es Deadlocks verursachen könnte.
Ich debattiere, ob dies als ein Duplikat qualifiziert: http://StackOverflow.com/Questions/9208921/async-on-main-method-of-console-app – spender
Sie könnten dieses tolle Video über Async auf channel9 sehen - http://channel9.msdn.com/events/TechDays/Techdays-2014-the-Netherlands/Async-programming-deep-dive – terrybozzio
Eine weitere hervorragende Ressource ist die Eduasync-Reihe von Blog-Posts von Jon Skeet http: // Codeblog. jonskeet.uk/category/eduasync/ – softveda