有没有办法同步使用 MongoDB C# 驱动程序
Is there a way to use the MongoDB C# driver synchronously
我有一个 2 层 C# 项目。第一个是连接到 mongodb 的数据层,并将集合发送到 Web 服务层。问题是我在新驱动程序中找不到非async
方法(即同步)。
有没有办法在 mongodb 2.0 版的 C# 驱动程序中使用同步方法?
提示:是否可以使用 c# 运行 mongodb shell 函数?
编辑:在驱动程序的 v2.2 中,他们正在为所有同步的异步操作添加同步版本 almost 一直向下。如果由于某种原因您不能使用 async-await,这是下一个最佳选择。
您应该使用async
操作,因为驱动程序是async
并且操作本质上是异步的(主要是I/O,通常到远程服务器)。
但是,如果您必须保持同步,您有 3 个选项,从最推荐到最不推荐:
- 继续使用旧 (v1.x) 版本的驱动程序和同步 API。
- 使用新驱动程序,但使用旧驱动程序 API (
client.GetServer
)。它需要一个不同的 nuget 包(名为 Legacy)并且具有两种类型的 API.
- 使用
async
操作并使用 Task.Result
或 Task.Wait
阻止它们。
首选旧版本,因为它使用同步 I/O 操作,这通常比使用 async
操作和阻塞操作要好。
其他选项都阻止 async
操作,但遗留驱动程序经过深思熟虑地实现、测试和维护,因此以一种好的方式完成阻止(即使用 ConfigureAwait(false)
和 GetAwaiter().GetResult()
无处不在)
You should be using the async operations as the driver is async and the operations are inherently asynchronous (being mainly I/O, usually to a remote server).
不!奥卡姆剃刀!最简单的答案通常是正确的。异步编程在继承上更难编程和调试。为什么被迫将它用于简单的任务。
这是我至少在自己的线程中强制同步的方法。
var c1 = collection.Find(filter);
var y = c1.ToListAsync();
y.Wait();
var w = y.Result.FirstOrDefault();
完美的例子。为什么只有一行代码需要 4 行代码。
我有一个 2 层 C# 项目。第一个是连接到 mongodb 的数据层,并将集合发送到 Web 服务层。问题是我在新驱动程序中找不到非async
方法(即同步)。
有没有办法在 mongodb 2.0 版的 C# 驱动程序中使用同步方法?
提示:是否可以使用 c# 运行 mongodb shell 函数?
编辑:在驱动程序的 v2.2 中,他们正在为所有同步的异步操作添加同步版本 almost 一直向下。如果由于某种原因您不能使用 async-await,这是下一个最佳选择。
您应该使用async
操作,因为驱动程序是async
并且操作本质上是异步的(主要是I/O,通常到远程服务器)。
但是,如果您必须保持同步,您有 3 个选项,从最推荐到最不推荐:
- 继续使用旧 (v1.x) 版本的驱动程序和同步 API。
- 使用新驱动程序,但使用旧驱动程序 API (
client.GetServer
)。它需要一个不同的 nuget 包(名为 Legacy)并且具有两种类型的 API. - 使用
async
操作并使用Task.Result
或Task.Wait
阻止它们。
首选旧版本,因为它使用同步 I/O 操作,这通常比使用 async
操作和阻塞操作要好。
其他选项都阻止 async
操作,但遗留驱动程序经过深思熟虑地实现、测试和维护,因此以一种好的方式完成阻止(即使用 ConfigureAwait(false)
和 GetAwaiter().GetResult()
无处不在)
You should be using the async operations as the driver is async and the operations are inherently asynchronous (being mainly I/O, usually to a remote server).
不!奥卡姆剃刀!最简单的答案通常是正确的。异步编程在继承上更难编程和调试。为什么被迫将它用于简单的任务。
这是我至少在自己的线程中强制同步的方法。
var c1 = collection.Find(filter);
var y = c1.ToListAsync();
y.Wait();
var w = y.Result.FirstOrDefault();
完美的例子。为什么只有一行代码需要 4 行代码。