Unterschied zwischen Finden und FindAsync
Schreibe ich eine sehr, sehr einfache Abfrage, die bekommt nur ein Dokument aus einer Sammlung, die nach Ihrer eindeutigen Id. Nach einigen frusteration (ich bin neu in mongo und der async /await-Programmierung-Modell), ich habe dies aus:
IMongoCollection<TModel> collection = //...
FindOptions<TModel> options = new FindOptions<TModel> { Limit = 1 };
IAsyncCursor<TModel> task = await collection.FindAsync(x => x.Id.Equals(id), options);
List<TModel> list = await task.ToListAsync();
TModel result = list.FirstOrDefault();
return result;
Funktioniert es, Super!!! Aber ich sehe immer wieder die Verweise auf einen "Find" - Methode, und ich erarbeitet:
IMongoCollection<TModel> collection = //...
IFindFluent<TModel, TModel> findFluent = collection.Find(x => x.Id == id);
findFluent = findFluent.Limit(1);
TModel result = await findFluent.FirstOrDefaultAsync();
return result;
Als es stellt sich heraus, dass dies auch funktioniert, Super!!!
Ich bin mir sicher, dass es einigen wichtiger Grund, dass wir haben zwei verschiedene Möglichkeiten, um diese Ergebnisse zu erreichen. Was ist der Unterschied zwischen diesen Methoden, und warum sollte ich wählen einen über den anderen?
async
- Schlüsselwort können Sie den compiler zu "managen", Ihren code mittels dem scheduler. Dies kann aber nicht immer machen Sie Ihre app multi-threaded. Die await
keyword-Signale an den compiler, gute Punkte zu entscheiden und wechseln Sie den Kontext oder nutzen einen neuen thread.Die
async
speziell nicht machen Sie Ihre app Multithread. Siehe hier. Dies ist nicht eine Frage zu C#, aber die Unterschiede in den Methoden zur Verfügung, von der MongoDB C# - API.Was meinst du damit, dass
FindAsync
Zukunft nicht machen Sie Ihre app mit multi-Threading? Es gibt eine gute chance, es wird das tun, wenn Sie nicht await
sofort.Nein, wenn Sie Lesen, den link habe ich gepostet, werden Sie sehen, dass die Verwendung
async
und await
wird explizit nicht threads erstellen. Es nicht schaffen einen hintergrund-thread, noch gibt Sie einen thread, um zu schlafen. Der springende Punkt bei der async
und await
ist der Verzicht auf die Kontrolle von einem thread, so dass eine message-loop können eine andere in der Warteschlange-up-Nachricht, die auf dem gleichen thread. Wenn das, was Sie await
ing nicht selbst ausführen, auf einen anderen thread, oder führen Sie eine hintergrund-Anfrage intrinsisch, hinzufügen await
wird nicht dazu führen es. Das anti-Beispiel für die Verwendung await
ist ein CPU-bound-Funktion.InformationsquelleAutor object88 | 2015-06-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist der Unterschied in der syntax.
Find
undFindAsync
beide erlaubt zu bauen, asynchrone Abfrage mit der gleichen Leistung, nurFindAsync
gibt cursor die laden nicht alle Dokumente auf einmal und bietet eine Schnittstelle zum abrufen der Dokumente eins nach dem anderen aus dem DB-cursor. Es ist hilfreich, wenn das Abfrage-Ergebnis ist riesig.Find
bietet Ihnen mehr einfache syntax durch die MethodeToListAsync
wo es im inneren ruft Dokumente von der cursor-und liefert alle Dokumente auf einmal.ToListAsync
, das wäre dann laden Sie alle Dokumente?). Ist, dass eine faire Bewertung?Für ein Dokument Finden, das sieht besser aus, weil Sie nicht arbeiten mit cursor.
InformationsquelleAutor rnofenko
Vorstellen, dass Sie diesen code ausführen, werden in einer web-Anfrage, die mit dem Aufruf find-Methode der thread, der die Anforderung so lange blockiert, bis die Datenbank die Ergebnisse zurückgeben, es ist ein synchron-Aufruf, wenn es eine lange Datenbank-operation, die dauert Sekunden, um abzuschließen, müssen Sie eine der verfügbaren threads zu dienen web-Anfrage nichts zu tun, einfach warten, die Datenbank gibt die Ergebnisse zurück, und verschwenden wertvolle Ressourcen (die Anzahl der threads im thread-pool ist begrenzt).
Mit FindAsync, den Faden Ihrer web-Anfrage wird frei sein, während, wartet die Datenbank für die Rückgabe der Ergebnisse, dies bedeutet, dass in der Datenbank nennen, dieser thread ist frei, an einem anderen web-Anfrage. Wenn die Datenbank liefert das Ergebnis wird dann der code mit der Ausführung fortfahren.
Für lange Operationen wie Lesen/schreiben aus Datei-system -, Datenbank-Operationen, komunizieren mit anderen Dienstleistungen, ist es eine gute Idee, verwenden Sie asynchrone Aufrufe. Denn während Sie warten, für die Ergebnisse, die Gewinde sind verfügbar für die anderen dienen, web-Anfrage. Dies ist mehr skalierbar.
Werfen Sie einen Blick auf diesen microsoft Artikel,https://msdn.microsoft.com/en-us/magazine/dn802603.aspx.
Funktioniert dieser code? Mit finden ist nicht notwendig, toList, weil es gerade gibt den ersten Gegenstand, den er findet, msdn.microsoft.com/en-us/library/x0b5b5bc%28v=vs.110%29.aspx
Ich erweiterte den code ein wenig zur Klärung der Frage.
Tut mir Leid-Sammlung ist nicht ein System.Sammlungen.Generisches.List<T> object. Weiter verdeutlicht...
InformationsquelleAutor Marc Cals