7

Ich benutze asp.net mvc-5 mit EF-6, und ich bin mir nicht sicher, ob die Verwendung erwarten + ToListAsync gültig ist . Zum Beispiel habe ich die folgende Repository-Methode, die eine IQeuryable zurück: -Ist es korrekt, wenn ich wait + ToListAsync() über IQueryable, die nicht als eine Aufgabe definieren

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

Und ich es wie folgt anzurufenden: -

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

Zu Beginn obwohl ich mir einen Fehler, weil ich bin Verwenden Sie "erwarten" eine Methode, die nicht als eine Aufgabe definiert ist, aber die oben genannten funktioniert gut ,, so kann jemand bitte auf diese bitte?

Antwort

12

Am Anfang dachte ich, werde ich einen Fehler, weil ich bin mit „erwarten“, ein Verfahren, das als Aufgabe ist nicht definiert, aber das funktionierte über gut

Eigentlich Sie sind warten auf eine Methode, die eine Task<T> zurückgibt, wobei T eine List<TSet> ist. Wenn Sie sich die Erweiterungsmethode QueryableExtensions.ToListAsync ansehen, sehen Sie, dass sie Task<List<TSource>> zurückgibt. Sie warten asynchron auf diese Methode, um die Datenbank abzufragen, die Liste zu erstellen und sie an den Aufrufer zurückzugeben. Wenn Sie bei einer solchen Methode await eingeben, wird die Methode erst wieder angezeigt, wenn der Vorgang abgeschlossen ist. async-await lässt Ihren Code synchron erscheinen, während die Ausführung tatsächlich asynchron ist.

+1

Gute und vollständige Erklärung. –

+0

@Yuval ich bin mir bereits dessen bewusst, aber normalerweise benutze ich warten auf eine Aufgabe, und die ganze Methode Kette in meinem Code wird Aufgabe + erwarten .. aber da ich nicht die IQueryable mit einer Aufgabe so wickeln kann ich tat es auf diese Weise, ich benutze IQueryable -> erwarten. tolistasync() ... also funktioniert dieser Code als - wenn der IQueryable in eine Aufgabe eingewickelt wird ?. also in meinem fall wird der iis thread freigegeben bis die tolistasync() vollständige ausführung fertig ist, wie normal funktionieren wird? –

+0

@johnG Ja. Der Thread wird freigegeben, während die Abfrage ausgeführt wird, und zurückgegeben, sobald der Vorgang abgeschlossen ist. –

8

Eigentlich gibt es kein Problem, weil Sie die ToListAsync() nicht die getAllScanEmailTo() awating sind.

EDIT: Um zu sehen, wie async-erwarten Muster funktioniert, können Sie diese link sehen. Hier ist ein nützliches Bild von dort

enter image description here

+0

so ist mein Ansatz gültig? Andernfalls wird die Ausführung angehalten, bis die ToListAsync() - Methode von IQueryable abgeschlossen ist. –

+0

Ich bearbeite meinen Beitrag. –

+0

Ja, ich kenne diesen Ausführungspfad sehr gut, aber meine ursprüngliche Frage war, wie wird erwartet + Iqurable arbeitet zusammen. da ich nicht ein IQueryable innerhalb einer Aufgabe wickeln kann .. so verwende ich erwarten + ToListAsync() aber über eine Nicht-Aufgabe-Methode, so wird dies irgendwelche Nebenwirkung, oder mein Code wird funktionieren als wenn ich eingewickelt habe das IQueryable in einer Aufgabe ?? Hast du meinen Standpunkt verstanden? –

2

Sie sind nicht „ein Verfahren warten“. Sie sind warten auf eine Task, die ein erwartetes ist.

Sie rufen getAllScanEmailTo, die eine IQueryable<TSet> zurückgibt, auf der Sie dann ToListAsync aufrufen, die die Task<List<TSet>> zurückgibt, die Sie erwarten.

+0

so mit IQerable mit warten, wie ich tue, ist gültig? Andernfalls wird die Ausführung angehalten, bis die ToListAsync() - Methode von IQueryable abgeschlossen ist. –

+0

@johnG ja. Sie warten auf die "Aufgabe", nicht auf die "IQueryable". Und ja, Sie warten auf den Abschluss von ToListAsync. – i3arnon

+0

, aber macht so die Ausführung auszusetzen, bis die ToListAsync() - Methode des IQueryable beendet? –