2013-08-16 11 views
8

Xamarin released Unterstützung für async/await, was die Entwicklung von Responsive UI in mobilen Plattformen wirklich vereinfacht. Ich möchte davon profitieren und die Programmierstufe meines Codes erhöhen, indem ich ab jetzt async/awarts-Sachen verwende.C#/MonoTouch: So rufen Sie eine Async-Methode auf, wenn ein ViewController erstellt wird/erscheint

Da ich aber zu C# relativ neu bin und nicht async/await verwendet, bevor ich Mühe, mich zu ‚Haken‘ in meinem Code zu finden, die ich async Methoden aufrufen kann. Ich weiß, dass Event-Handler die typischen Orte sind (wo IoC geschieht), aber stellen Sie sich das folgende Szenario vor:

Ich möchte Hintergrund-Task starten, wenn ein Viewcontroller geladen wird (im Gegensatz zu Gegensatz, wenn eine Taste gedrückt wird) .

async Task PerformMyTaskAsync() 
{ 
    // ... 
    await ... // another async API 
    // ... 
} 

public override void ViewDidLoad() 
{ 
    base.ViewDidLoad(); 

    // .. initialize UI 
    await PerformMyTaskAsync(); 
} 

Natürlich kann ich nicht für PerformMyTaskAsync in ViewDidLoad erwarten, weil ViewDidLoad weder ein asynchrones Verfahren ist noch ein Event-Handler.

Was ist der "alternative" Ansatz zum Starten einer Hintergrund-Task, wenn ein View-Controller geladen wird (oder erscheint, was auch immer)?

+0

Schauen Sie sich ein Webinar von Miguel auf Async http://blog.xamarin.com/csharp-async-on-ios-and-android/ –

+0

ich es gestern live zu beobachten. Solch eine großartige Erklärung, die von Miguel gemacht wurde, aber nicht genau beschreibt, wonach ich frage. Danke für den Link trotzdem. –

Antwort

17

Die neuesten Xamarin Stable Channel-Versionen unterstützen Async/Await-Überladungen für ViewController Lifecycle-Methoden. Versuchen:

public async override void ViewDidLoad() 
+0

Das wusste ich nicht, mein Problem ist also gelöst! –

+0

Und was ist mit der Warnung, dass die Methode nicht zurückgeben sollte, wenn async? – Chucky

+0

@Chucky Normalerweise möchten Sie * nie * eine asynchrone Methode zurückgeben, um viele Probleme zu vermeiden, daher die Warnung. Die einzigen Ausnahmen sind Event-Handler und in diesem Fall Lifecycle-Methoden (in diesem Fall können Sie die Warnung ignorieren). Stellen Sie sicher, dass Sie den Code innerhalb des asynchronen void in einen try-catch-Code einschließen. – Seafish

1

Nicht sicher, ob dies der "beste" Ansatz ist, aber haben Sie versucht, ein Ereignis aus ViewDidLoad() auslösen, und dann in der Handler für dieses Ereignis Ihren Async-Code starten?

+0

Sieht wie eine nette Abhilfe aus, ich habe keinen anderen Code gesehen, der das tut, aber vielleicht wird das ein Muster. –

Verwandte Themen