2016-07-29 2 views
4

ich mit der Scala Programmiersprache gewohnt bin zu arbeiten - Scala mit I über Futures-Karte könnte, wie zum Beispiel:C# - eine async Aufgabe von einem Typ in einer anderen verwandeln

val response: Future[HttpResponse] = asyncHttpClient.GetRequest("www.google.com") 

val statusCode: Future[Int] = response.map(r => r.statusCode) 

Vor kurzem habe ich abgeholt mit C# arbeiten, und ich sah mich in der gleichen Situation wie das obige Beispiel, aber ich konnte nicht herausfinden, wie eine Aufgabe "map".

Hier ist ein Beispiel dessen, was ich erreichen will:

Task<HttpResponseMessage> response = httpClient.GetAsync("www.google.com") 

Task<int> statusCode = response.Map(response => response.StatusCode) 

Dank

Antwort

5

Die direkte Übersetzung mit den bestehenden Methoden wäre:

Task<int> statusCode = response.ContinueWith(t => t.Result.StatusCode) 

jedoch in der Praxis Sie erwarten fast immer die Aufgabe, um das Ergebnis zu erhalten. Vielleicht solltest du in async schauen/warten.

+0

Im Wesentlichen hat Jon Skeet dies implementiert, aber da Sie mir tatsächlich eine Standardbibliotheksmethode zur Verfügung stellen, werde ich Ihre Antwort akzeptieren. –

+0

Ich denke @ Jon Skeets Antwort ist auch weniger effizient, weil es die Zustandsmaschine für das Warten schafft. Nicht ganz sicher, aber vielleicht gibt es ein Problem mit ContinueWith, das ich nicht sehe. – Stilgar

+2

Diese Version wird leicht abweichende Ausnahmebehandlung haben. Ihre werden eine 'AggrageException' auslösen, die die tatsächliche Ausnahme enthält, John's wird die tatsächliche Ausnahme auslösen. –

4

Ich bin ein wenig überrascht, nichts für diese im Rahmen gibt es, um ehrlich zu sein. (Wahrscheinlicher ist, gibt es ein Ich habe es nicht gesehen.) Sie können es bauen ziemlich leicht aber:

public static async Task<TResult> Map<TSource, TResult> 
    (Task<TSource> task, Func<TSource, TResult> selector) 
    => selector(await task); 
+0

Vielleicht, weil ContinueWith ziemlich nah ist? – Stilgar

+0

Es gibt ein ganzes [LINQ über Aufgaben] (https://blogs.msdn.microsoft.com/pfxteam/2010/04/04/parallelextensionsextras-tour-1-linq-to-tasks/) Experiment von TPL Extras, aber es nie wirklich abgehoben. –

+0

@Stilgar: Ja, das stimmt auch. –

Verwandte Themen