2016-03-21 17 views
5

Sto utilizzando MvvmCross e la libreria AsyncEx all'interno di un'app di Windows 10 (UWP).codice di blocco # c in modalità asincrona

In un ViewModel, ho una proprietà INotifyTaskCompletion (1) che è collegato da dare un metodo Async nella (2)

In (2), chiamo un metodo biblioteca asincrona ViewModel cui:

  • assegni una cache locale
  • Download dati in modo asincrono
  • aggiunge i dati nella cache

Il codice di memorizzazione nella cache non può essere reso asincrono e quindi il metodo di libreria contiene sia il blocco che il codice asincrono.

D. Qual è il modo migliore per impedire il blocco del thread dell'interfaccia utente?

Capisco da Stephen Cleary di non bloccare in codice asincrono e non utilizzare Task.Run nei metodi di libreria. Quindi devo ...

Spostare le chiamate nella cache in (2), ad es.

  • Usa Task.Run (per controllare la cache)
  • Chiamare il metodo di raccolta in modo asincrono
  • Usa Task.Run di nuovo (per memorizzare nella cache i dati)?

C'è un modo migliore?

+1

Hai qualche codice che potresti condividere? –

+0

Dipende dalla tua definizione di "migliore". Se non puoi cambiare il codice della cache e vuoi usare async/await, allora usare 'Task.Run()' per il codice di caching è "corretto". – Jcl

risposta

3

Se si dispone di codice completamente sincrono che non è possibile modificare per rendere un ritorno attendibile e si desidera renderlo asincrono, allora sì, l'unica scelta se si desidera utilizzare async/await deve utilizzare Task.Run().

Qualcosa di simile:

public async Task<T> MyMethod() 
{ 
    T result = await Task.Run(() => CheckCacheOnSyncMethodICantChange()); 
    if(result != null) 
    { 
    result = await MyLibraryMethodThatReturnsATask(); 
    await Task.Run(() => AddToCacheOnSyncMethodICantChange(result)); 
    } 
    return result; 
} 

dovrebbe essere ok.

+0

Grazie. Segnerò la tua risposta come corretta. – Howard

+0

Nonostante la mia risposta, e per il caso specifico, una cache dovrebbe essere veloce (questo è il motivo per cui la si usa) ... Sei sicuro di aver bisogno di rendere i metodi della cache asincroni? – Jcl

+1

Sto usando SQLite.net per memorizzare i dati in un database basato su file. Poiché questo lavoro non è vincolato alla CPU, voglio farlo senza bloccare il thread dell'interfaccia utente. Ho perso qualcosa? – Howard