Ich wurde von async verwöhnt / warte ab! Jetzt kämpfen mit expliziten Task-Fortsetzungen

9

Bearbeiten (nach der Annahme)

Es ist vielleicht nicht sofort offensichtlich, aber @ Servys Antwort ist richtig, ohne eine benutzerdefinierte Implementierung von Unwrap unter monodroid zu benötigen - in meinen Kommentaren sagte ich, dass es nicht existierte, aber es ist definitiv.

Bearbeiten beenden

Ich schreibe eine Reihe von Apps, die unsere REST-fähigen Web-Services verwenden, und obwohl ich weiß, wie man Aufgaben richtig verwendet, stellt sich heraus, dass ich es nicht tue. Das Szenario ist, dass ich Code für Windows Store implementiert habe - mit async/await und ich muss etwas fast identisch für MonoDroid implementieren - das hat das nicht (ohne einige Build-Hacks, die ich nicht verwenden möchte) / p>

Ich habe das Problem für diese Frage auf eine einfache Reihe von Aufgaben reduziert, um eine Ganzzahl asynchron zu erhalten, und dann in der Folge eine andere asynchrone Aufgabe auszulösen, die eine aus dieser Ganzzahl aufgebaute Zeichenfolge umwandelt. In C # 5 wäre das:

Hinweis - natürlich verwende ich hier Task.FromResult<T> anstelle des tatsächlichen asynchronen Codes

%Vor%

Um dies in ein fortsetzungsbasiertes Muster umzuwandeln, habe ich Folgendes versucht:

%Vor%

Dies ist jedoch nicht korrekt, da die Methode GetStringFromIntAsync eine Task<string> zurückgibt, was bedeutet, dass die Fortsetzung ein Task<Task<string>> anstelle von Task<string> zurückgibt.

Ich habe festgestellt, dass das explizite Warten auf die GetStringFromIntAsync -Methode jedoch funktioniert:

%Vor%

Die Frage ist jedoch, - ist das der richtige Weg, um es zu tun - kann ich keine Fortsetzung irgendeiner Art zurückgeben, auf die der Anrufer dann wartet?

Ich habe Aufgaben ziemlich oft benutzt - aber nicht, um Aufgaben verschiedener Typen zusammen zu ketten (außer mit async / await natürlich) - und fühle mich ein bisschen wie ich hier verrückt werde - also egal Hilfe wird sehr geschätzt.

    
Andras Zoltan 18.01.2013, 16:02
quelle

3 Antworten

5

Also, zuerst, Ihre nicht-asynchronen / warten Sie auf Ergänzungen der zweiten und dritten Implementierungen ist was Sie tun sollten, auch wenn Sie Async / warten. Die Verwendung fügt nichts hinzu, außer ein wenig unnötigen Overhead.

Wie im ersten Fall möchten Sie nicht Wait verwenden. Dadurch wird der Thread blockiert, anstatt dass er in den Pool zurückgegeben werden kann. Sie müssen nur die Aufgabe auspacken und ihre innere Aufgabe bekommen. Sie können dazu die Methode Unwrap verwenden:

%Vor%

Hier ist eine Unwrap -Funktion, die Sie verwenden können, wenn Ihnen eine nicht zur Verfügung steht.

%Vor%     
Servy 18.01.2013, 16:07
quelle
0

Für einen vollständig unterstützten Ansatz ist es wahrscheinlich das Beste, auf die offizielle async / awar Unterstützung für MonoDroid zu warten - Xamarin hat gesagt, dass dies "bald kommt" - die erste Hälfte des Jahres.

Wenn Sie sich jedoch abenteuerlustiger fühlen ... dann haben mindestens ein paar Leute es geschafft, in MonoDroid zu arbeiten:

  • Verwenden von "Full Mono" - Ссылка
  • Verwenden von "Microsoft BCL" - siehe das twitterersearch-Beispiel und den Code aus Daniel Plaisteds Rede bei BUILD Ссылка
Stuart 19.01.2013 12:18
quelle
-1

Das ist, was ich mit asynchronen Aufgaben in .net 4.0 (VS 2010) getan habe. Einige haben gesagt, dass Sie nicht task.Wait(); aufrufen müssen und andere haben gesagt, ja, Sie müssen task.Wait(); aufrufen. Ich denke, der Unterschied ist, ob task.Wait () in der task.Result -Eigenschaft impliziert / gekapselt ist.

Ich blieb bei dem expliziteren Ansatz, task.Wait(); aufzurufen.

Dies wird blockiert, bis der Anruf beendet ist, aber ich bin mir nicht sicher, welche anderen Optionen verfügbar sind, wenn Sie nicht mit 4.5 arbeiten.

    
Jason Meckley 18.01.2013 16:10
quelle