2013-08-16 10 views
8

Xamarin released supporto per async/await che semplifica davvero lo sviluppo dell'interfaccia utente reattiva nelle piattaforme mobili. Mi piacerebbe approfittarne e aumentare il livello di programmazione del mio codice usando async/attendi roba da ora in poi.C#/MonoTouch: come chiamare un metodo asincrono quando viene creato/visualizzato ViewController

Tuttavia, dato che sono relativamente nuovo per C# e non ho usato async/await prima che io sto avendo difficoltà a trovare 'ganci' nel mio codice che posso richiamare async metodi. So che i gestori di eventi sono i luoghi tipici (dove IOC accade), ma immagino che il seguente scenario:

voglio iniziare sfondo compito quando un ViewController viene caricato (al contrario di quando viene premuto un tasto) .

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

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

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

Ovviamente non posso attendo per PerformMyTaskAsync in ViewDidLoad perché ViewDidLoad non è né un metodo asincrono né un gestore di eventi.

Qual è l'approccio "alternativo" per avviare un'attività in background quando un controller di visualizzazione carica (o appare, qualunque sia)?

+0

Partenza un webinar da Miguel su Async http://blog.xamarin.com/csharp-async-on-ios-and-android/ –

+0

ho visto dal vivo ieri. Una così grande spiegazione fatta da Miguel, ma che non copre esattamente quello che sto chiedendo. Grazie per il collegamento comunque. –

risposta

17

Le ultime versioni di Xamarin Stable Channel supportano sovraccarichi Async/Attendi per i metodi del ciclo di vita ViewController. Prova:

public async override void ViewDidLoad() 
+0

Non lo sapevo, quindi il mio problema è risolto! –

+0

E per quanto riguarda l'avviso che il metodo non dovrebbe restituire void se async? – Chucky

+0

@Chucky Solitamente * non * si vuole restituire void da un metodo asincrono per evitare molti problemi, da qui l'avviso. Le uniche eccezioni riguardano i gestori di eventi e, in questo caso, i metodi del ciclo di vita (quindi in questo caso è possibile ignorare l'avviso). Assicurati di avvolgere qualsiasi codice all'interno del vuoto asincrono in un try-catch. – Seafish

1

Non sono sicuro se questo è l'approccio "migliore", ma hai provato a lanciare un evento da ViewDidLoad(), e quindi nel gestore per quell'evento che avvia il tuo codice Async?

+0

Sembra una buona soluzione, non ho visto nessun altro codice per farlo, ma forse questo diventa uno schema. –

Problemi correlati