В документации для MongoClient
, MongoServer
, MongoDatabase
и MongoCollection<T>
Я вижу, что сказано, что они потокобезопасны.MongoDB C# Driver and Thread Safety
Вопрос: Означает ли это, что у меня могут быть (например) статические поля из них в классе и доступ к ним из любого Task
/Thread
?
Как:
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");
Специально о MongoCollection<T>
; Я хочу быть уверенным, что что-то вроде var cursor = Docs.Find(query).SetLimit(50);
не выполняет мутацию на MongoCollection<T>
(это статическое состояние, если быть точным).
так что да и нет. в то время как нормальные операции над полями не изменят свое «состояние» для других потоков/задач, вы можете скрыть (инкапсулировать) мутирующие функции в частных методах, чтобы избежать изменения их состояния по ошибке (например, случайно переписать или отменить их значение). Взгляните на этот код, который является кодом кода C#. Единичные тесты: https://github.com/mongodb/mongo-csharp-driver/blob/296795e687d62dd97bd38204ccd026644fa76eae/MongoDB.DriverUnitTests/Configuration.cs –
Обратите внимание, что класс MongoCursor is * not * потокобезопасный, так что ваш пример хороший - верните курсор из коллекции - он безопасен для поля коллекции, но возвращаемый курсор, конечно, не является потокобезопасным и не должен быть разделен между задачами. –
@ АсяКамский Спасибо; Но здесь «MongoCursor» не используется как общий ресурс (например, публичное статическое поле). Но я не знаю, 'MongoCollection' является потокобезопасным, или нет, однако, просмотрев связанный образец. –