我有一个2层的C#项目。第一个是连接到mongodb并将集合发送到Web服务层的数据层。问题是我在新的驱动程序中找不到非async
方法(即同步)。
有没有办法在mongodb版本2.0中使用C#驱动程序的同步方法?
提示:是否可以使用c#运行mongodb shell函数?
答案 0 :(得分:11)
编辑:在驱动程序的v2.2中,他们为所有同步几乎的异步操作添加了同步版本。如果由于某种原因你不能使用async-await,这是下一个最好的选择。
你应该使用async
操作,因为驱动程序是async
,并且操作本质上是异步的(主要是I / O,通常是远程服务器)。
但是,如果你必须保持同步,你有3个选项,从最推荐的到最低的顺序排列:
client.GetServer
)。它需要一个不同的nuget包(名为Legacy)并且具有两种类型的API。async
操作并使用Task.Result
或Task.Wait
屏蔽它们。旧版本是首选,因为它使用同步I / O操作,这通常比使用async
操作并阻塞它们更好。
其他选项都阻止了async
操作,但遗留驱动程序经过精心实施,测试和维护,因此阻塞工作得到了很好的解决(即在所有地方使用ConfigureAwait(false)
和GetAwaiter().GetResult()
)
答案 1 :(得分:4)
您应该使用异步操作,因为驱动程序是异步的,操作本质上是异步的(主要是I / O,通常是远程服务器)。
NO!奥卡姆剃刀!最简单的答案通常是正确的答案。异步编程继续编程和调试更加困难。为什么被迫将它用于简单的任务。
以下是我至少在自己的主题中强制同步的方法。
var c1 = collection.Find(filter);
var y = c1.ToListAsync();
y.Wait();
var w = y.Result.FirstOrDefault();
完美的例子。为什么只有一行代码需要4行代码。