2015-05-07 4 views
9

Der neue C# -Treiber ist völlig Async und in meinem Verständnis dreht ein wenig die alten Entwurfsmuster wie DAL in n-Tier-Architektur.Die Änderungen in MongoDB neuen C# -Treiber (Async und Await)

In meinem Mongo DALs verwende ich zu tun:

die beharrte ObjectId Ich kann
public T Insert(T entity){ 
    _collection.Insert(entity); 
    return entity; 
} 

bekommen diese Weise.

Heute ist alles Async wie InsertOneAsync.
Wie würde Insert Methode nun entity zurückgeben, wenn die InsertOneAsync getan wird? Können Sie ein Beispiel zeigen?

Antwort

13

Es ist hilfreich, die Grundlagen von async/await zu verstehen, weil es eine etwas undichte Abstraktion ist und eine Reihe von Fallstricken hat.

Im Wesentlichen gibt es zwei Möglichkeiten:

  • synchron bleiben. In diesem Fall ist es sicher, .Result und für die asynchronen Aufrufe zu verwenden, z. etwas wie

    // Insert: 
    collection.InsertOneAsync(user).Wait(); 
    
    // FindAll: 
    var first = collection.Find(p => true).ToListAsync().Result.FirstOrDefault(); 
    
  • Gehen Sie async in Ihrer Codebasis. Async zu machen ist leider ziemlich "infektiös", also konvertierst du entweder so ziemlich alles in Async oder nicht. Vorsicht, mixing sync and async incorrectly will lead to deadlocks. Die Verwendung von Async hat eine Reihe von Vorteilen, da Ihr Code weiterhin ausgeführt werden kann, während MongoDB noch arbeitet, z.

    // FindAll: 
    var task = collection.Find(p => true).ToListAsync(); 
    // ...do something else that takes time, be it CPU or I/O bound 
    // in parallel to the running request. If there's nothing else to 
    // do, you just freed up a thread that can be used to serve another 
    // customer... 
    // once you need the results from mongo: 
    var list = await task; 
    
+0

Verwendung MongoDB synchron wie Aufrufen einer SQL-Datenbank mit einer klassischen ASP-Anwendung sein würde? Würde es die gesamte Website sperren, bis der Anruf beendet ist? – RPDeshaies

+0

Müssen Sie etwas Spezielles hinzufügen, damit die Task 'warten' funktioniert? Es schreit ständig, dass "erwarten" auf etwas "asynchron" ausgeführt werden muss ... aber natürlich ist es, da '.ToListAsync()' da ist. Irgendeine Idee was könnte das Problem sein ?? @mnemosyn –

+0

@mcpDESIGNS: 'erwarten 'kann nur von Methoden verwendet werden, die als' async 'deklariert sind. – mnemosyn