Ich habe einige widersprüchliche Informationen zu diesem Thema gesehen, und ich möchte hier einige Klarheit erreichen.Wie richtig asynchronicity in Web API implementieren 2
Ursprünglich würden Sie Web Api Aktionen haben, wie:
Model Action();
HttpResponseMessage Action();
Dann mit dem Zusatz von TPL Erweiterungen Web Api, könnten Sie haben
Task<Model> Action();
Task<HttpResponseMessage> Action();
Und angeblich würde ASP.NET intelligent genug, um diejenigen zu handhaben durch das Warten auf die Aufgabe, zu beenden und durch die Fadenfreigabe, der die Anforderung in der Zwischenzeit abgeholt.
Schön! Alles war einfach in der Welt. Aber jetzt, mit Web API 2, gibt es einen Zusatz von IHttpActionResult
, ein dritter Fall, der die Task<HttpResponseMessage> ExecuteAsync()
Methode zur Verfügung stellt.
Zunächst einmal, wenn Sie Implementierungen von IHttpActionResult
untersuchen, sehen Sie, dass jeder ExecuteAsync
eigentlich nur wieder Task.FromResult
(nicht im ASYNC und scheint nicht, wie es synchron jede Performance-Gewinn geben würde über HttpResponseMessage
Rückkehr). Zweitens sehe ich Leute, die die Verwendung von Task<IHttpActionResult>
empfehlen, was völlig redundant erscheint. Ich sehe sogar eine Handvoll Leute, die vorschlagen, dass Sie diese Ansätze kombinieren und Task.Factory.StartNew(..)
von Ihrer Aktion zurückgeben, was irgendwie absurd erscheint.
Also, was ist der richtige Weg, IHttpActionResult
asynchron zu verwenden? Implementieren Sie einfach Ihre eigenen und führen Sie asynchrone Operationen dort aus † oder geben Sie Task<IHttpActionResult>
zurück, machen Sie Ihre Methode async
, und warten Sie auf IO-gebundene Operationen, bevor Sie return Ok()
(oder gleichwertig) aufrufen?
Um klar zu sein, ich verstehe natürlich, dass einfach von IHttpActionResult Action();
bis Task<IHttpActionResult> Action();
ohne Änderung der Methode Körper wird in keiner Weise helfen. Es ist die Absicht der ExecuteAsync
das ist ein Puzzle.
† https://stackoverflow.com/a/21609402/661422
Mit 'Task.FromResult' ist ein Detail Umsetzung - das ist hat die Implementierer die Entscheidung, nicht zu verwenden Asynchronität genommen, aber entscheiden kann es in Zukunft zu verwenden, wenn es gerechtfertigt ist. Während es keine gute Möglichkeit gibt, eine synchrone API asynchron zu implementieren. So –