W dokumentacji dla MongoClient
, MongoServer
, MongoDatabase
i MongoCollection<T>
Widzę, że mówi się, że są bezpieczne dla wątków.MongoDB C# Driver and Thread Safety
Pytanie: Czy to oznacza, że mogę mieć (na przykład) ich statyczne pola w klasie i uzyskać do nich dostęp z dowolnego numeru Task
/Thread
?
odczuwalna:
public static MongoClient Client = new MongoClient(Properties.Settings.Default.MongoConnStr);
public static MongoServer Server = Client.GetServer();
public static MongoDatabase DraftDB = Server.GetDatabase("draftdb");
public static MongoCollection<MyDoc> Docs = Program.DraftDB.GetCollection<Location>("mydocs");
Specjalnie o MongoCollection<T>
; Chcę mieć pewność, że coś takiego jak var cursor = Docs.Find(query).SetLimit(50);
nie wykonuje mutacji na MongoCollection<T>
(to jest statyczny stan, aby być precyzyjnym).
tak tak i nie. podczas gdy normalne operacje na polach nie zmienią ich "stanu" dla innych wątków/zadań, możesz chcieć ukryć (enkapsulować) funkcje mutowania w prywatnych metodach, aby uniknąć przypadkowego zmienienia ich stanu (na przykład przypadkowego nadpisania lub cofnięcia przypisania wartości). Rzuć okiem na ten kod, którym jest kod sterownika C# Testy jednostkowe: https://github.com/mongodb/mongo-csharp-driver/blob/296795e687d62dd97bd38204ccd026644fa76eae/MongoDB.DriverUnitTests/Configuration.cs –
Zwróć uwagę, że klasa MongoCursor to * nie * Wątek bezpieczny, więc twój przykład jest dobry - odbieranie kursora z kolekcji - jest bezpieczny dla pola zbierania, ale zwracany kursor nie jest oczywiście bezpieczny dla wątków i nie może być dzielony między zadania. –
@AsyaKamsky Thanks; Ale tutaj 'MongoCursor' nie jest używany jako zasób udostępniony (jak publiczne pole statyczne). Ale nie wiem "MongoCollection" jest bezpieczny dla wątków, czy też nie, patrząc na połączoną próbkę. –