7

Sto usando asp.net mvc-5 con EF-6, e non sono sicuro se l'uso attende + ToListAsync è valido . Per esempio io ho il seguente metodo repository che restituisce un IQeuryable: -E 'corretto se sto usando wait + ToListAsync() su IQueryable che non è definito come attività

public IQueryable<TSet> getAllScanEmailTo() 
{ 
    return t.TSets.Where(a=>a.Name.StartsWith("ScanEmail"));  
} 

E mi chiamo come segue: -

var emailsTo = await repository.getAllScanEmailTo().ToListAsync(); 

All'inizio ho pensato io ottengo un errore perché io sono usando "attendi" un metodo che non è definito come un compito, ma quanto sopra ha funzionato bene, quindi qualcuno può consigliarlo su questo?

risposta

12

All'inizio ho anche se mi metterò un errore perché sto usando "attendono" un metodo che non è definito come un compito, ma quanto sopra ha funzionato ben

In realtà, voi sono in attesa di un metodo che restituisce un Task<T>, dove T è un List<TSet>. Se osservi il metodo di estensione QueryableExtensions.ToListAsync, vedrai che restituisce un valore Task<List<TSource>>. Stai aspettando in modo asincrono questo metodo per interrogare il database, creare l'elenco e restituirlo al chiamante. Quando si utilizza il metodo await, il metodo non verrà restituito fino al completamento dell'operazione. async-await rende il tuo codice sentito sincrono, mentre l'esecuzione è in realtà asincrona.

+1

Buona e completa spiegazione. –

+0

@Yuval sono già a conoscenza di questo, ma di solito uso attendo per un compito, e tutta la catena di metodi all'interno del mio codice sarà Task + attendi .. ma dal momento che non riesco a racchiudere l'IQueryable con un Task così io ha fatto in questo modo, sto usando IQueryable -> attendo .tolistasync() ... quindi questo codice funzionerà come-se IQueryable è racchiuso all'interno di un'attività ?. quindi nel mio caso il thread di iis verrà rilasciato fino all'esecuzione completa di tolistasync(), come normalmente attende l'operazione? –

+0

@johnG Sì. Il thread verrà rilasciato mentre la query viene eseguita e restituito al termine. –

8

In realtà non ci sono problemi perché si sta magnificando lo ToListAsync() non lo getAllScanEmailTo().

MODIFICA: Per vedere come funziona il modello asincrono, è possibile vedere questo link. Ecco un'immagine utile da lì

enter image description here

+0

quindi il mio approccio è valido? altrimenti, sospenderà l'esecuzione fino al completamento del metodo ToListAsync() dell'IQueryable . –

+0

Ho modificato il mio post. –

+0

sì, conosco molto bene questo percorso di esecuzione, ma la mia domanda iniziale era come attenderò + Iqurable funziona insieme. dal momento che non riesco a racchiudere un IQueryable all'interno di un'attività .. quindi sto usando Wait + ToListAsync() ma su un metodo non-task, quindi questo avrà effetti collaterali, o il mio codice funzionerà come se fosse avvolto l'IQueryable all'interno di un'attività? hai capito? –

2

Lei non è "in attesa di una modalità". Sei in attesa di un Task, che è un aspetto attendibile.

Si chiama getAllScanEmailTo che restituisce un IQueryable<TSet> su cui è quindi chiamare ToListAsync che restituisce il Task<List<TSet>> che si è in attesa.

+0

quindi l'utilizzo di IQuerable in attesa come sto facendo è valido? altrimenti, sospenderà l'esecuzione fino al completamento del metodo ToListAsync() dell'IQueryable . –

+0

@johnG sì. Stai aspettando il 'Task', non il' IQueryable'. E sì, attenderete 'ToListAsync' per completare. – i3arnon

+0

ma in questo modo sospenderà l'esecuzione fino al completamento del metodo ToListAsync() dell'IQueryable ?? –