2015-05-07 11 views
9

Il nuovo driver C# è totalmente Async e, a mio modo di vedere, distorce un po 'i vecchi schemi di progettazione come DAL nell'architettura di livello.Comprensione delle modifiche in MongoDB nuovo driver C# (Async e Attesa)

Nei miei dals Mongo che uso per fare:

public T Insert(T entity){ 
    _collection.Insert(entity); 
    return entity; 
} 

In questo modo posso ottenere il persistito ObjectId.

Oggi, tutto è Async come InsertOneAsync.
In che modo il metodo Insert restituirà ora lo entity quando verrà eseguito lo InsertOneAsync? Puoi mostrare un esempio?

risposta

13

È utile comprendere le nozioni di base di async/await in quanto si tratta di un'astrazione alquanto lacerante e presenta numerose insidie.

In sostanza, si hanno due opzioni:

  • rimanere sincrona. In questo caso, è sicuro usare .Result e .Wait() sulle chiamate asincrone, rispettivamente, ad es. qualcosa come

    // Insert: 
    collection.InsertOneAsync(user).Wait(); 
    
    // FindAll: 
    var first = collection.Find(p => true).ToListAsync().Result.FirstOrDefault(); 
    
  • Async nel codice base. Farlo asincrono è piuttosto "contagioso", sfortunatamente, quindi o convertite praticamente tutto in asincrono, oppure no. Attento, mixing sync and async incorrectly will lead to deadlocks. L'utilizzo di async ha una serie di vantaggi, perché il tuo codice può continuare a funzionare mentre MongoDB continua a funzionare, ad es.

    // 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

Uso MongoDB sincrono sarebbe come chiamare un database SQL con un'applicazione ASP classico? Bloccherebbe l'intero sito Web fino a quando la chiamata è finita? – RPDeshaies

+0

Hai bisogno di aggiungere qualcosa di specifico per far funzionare la linea 'await task'? Continua a urlare che "attendere" deve essere fatto su qualcosa di "asincrono" ... ma ovviamente lo è, dal momento che ".ToListAsync()" è lì. Qualche idea su quale potrebbe essere il problema ?? @mnemosyn –

+0

@mcpDESIGNS: 'await' può essere utilizzato solo da metodi dichiarati' async'. – mnemosyn

Problemi correlati