2015-05-08 3 views
3

У меня есть 2-слойный проект C#. Первый - это слой данных, который соединяется с mongodb и отправляет коллекции на уровень веб-сервиса. Проблема в том, что я не смог найти в новом драйвере методы не async (т. Е. Синхронно).Есть ли способ использовать MongoDB C# драйвер синхронно

Есть ли способ использовать синхронные методы с драйвером C# для версии mongodb версии 2.0?

Подсказка: возможно ли запустить функции оболочки mongodb с помощью C#?

ответ

10

EDIT: В версии 2.2 драйвера они добавляют синхронные версии для всех асинхронных операций, которые являются синхронными почти полностью вниз. Если вы не можете использовать async-await по какой-то причине, это следующий лучший вариант.


Вы должны быть с помощью async операции, как водитель async и операции по своей природе асинхронной (будучи в основном ввода/вывода, как правило, на удаленный сервер).

Но, если вы должны держать вещи синхронны у вас есть 3 вариант, заказанный из наиболее рекомендуемых наималейших:

  1. продолжать использовать старую (v1.x) версию драйвера с синхронным API.
  2. Используйте новый драйвер, но с устаревшим API (client.GetServer). Он требует другого пакета nuget (называемого Legacy) и имеет оба типа API.
  3. Используйте операции async и блокируйте их с помощью Task.Result или Task.Wait.

Старая версия является предпочтительной, поскольку она использует синхронные операции ввода-вывода, которые обычно лучше, чем использование async и блокировка на них.

другие варианты, как блок на async операций, но водитель унаследованной задумчиво реализованы, протестированы и поддерживаются таким образом, блокировка делается в хорошем смысле (т.е. с использованием ConfigureAwait(false) и GetAwaiter().GetResult() везде)

+0

спасибо за ваше время – fatihyildizhan

+0

Стоит прочитать этот https://www.mongodb.com/blog/post/introducing-20-net-driver – KCD

3

Вы должны использовать операции async, поскольку драйвер является асинхронным, а операции по сути являются асинхронными (в основном, I/O, как правило, на удаленном сервере).

НЕТ! Бритва Оккама! Самый простой ответ, как правило, правильный. асинхронное программирование наследуется сложнее для программирования и отладки. Зачем использовать его для простых задач.

Вот что я делаю, чтобы принудительно синхронизировать хотя бы внутри моей собственной нити.

var c1 = collection.Find(filter); 
var y = c1.ToListAsync(); 
y.Wait(); 
var w = y.Result.FirstOrDefault(); 

Perfect case в пункт. Почему есть 4 строки кода, когда требуется только один.

+0

как насчет вставки или обновления? –

+0

Вам не нужно много кода, почему бы просто не сделать 'collection.Find (filter) .ToListAsync(). Result.FirstOrDefault()'? И сравнивая это, sync один liner 'collection.Find (фильтр).ToList(). FirstOrDefault() 'это не такая уж большая разница, но вы правы в отношении внутренней реализации, и ваша точка зрения о Razor Оккама так +1, в любом случае, что сделала команда Mongo C#, это смешно. –

Смежные вопросы