Pomocne jest zrozumienie podstaw async
/ await
ponieważ jest to nieco nieszczelna abstrakcja i ma wiele pułapek.
Zasadniczo masz dwie opcje:
-
Pozostań synchroniczny. W takim przypadku można bezpiecznie użyć
.Result
i.Wait()
na wywołaniach asynchronicznych, odpowiednio, np. coś takiego// Insert: collection.InsertOneAsync(user).Wait(); // FindAll: var first = collection.Find(p => true).ToListAsync().Result.FirstOrDefault();
-
Przejdź asynchronicznie w swojej bazie kodu. Robienie tego asynchronicznie jest niestety dość "zakaźne", więc albo konwertujesz prawie wszystko na asynchroniczne, albo nie. Ostrożnie, nieprawidłowe mieszanie synchronizacji i asynchronii doprowadzi do zakleszczenia . Używanie async ma wiele zalet, ponieważ Twój kod może nadal działać, gdy MongoDB nadal działa, np.
// 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;