C# MongoDB FindAsync从未在等待时返回
我已经查看了所有处理FindAsync的类似线程,它们在Wait上不返回,但没有一个线程帮助我解决了问题,因此我再次在此提问 我在一个WPF应用程序(.Net Framework 4.7.2)中,试图使用MongoDB的C#驱动程序(最新版本2.9)使用C# MongoDB FindAsync从未在等待时返回,c#,wpf,mongodb,mongodb-.net-driver,C#,Wpf,Mongodb,Mongodb .net Driver,我已经查看了所有处理FindAsync的类似线程,它们在Wait上不返回,但没有一个线程帮助我解决了问题,因此我再次在此提问 我在一个WPF应用程序(.Net Framework 4.7.2)中,试图使用MongoDB的C#驱动程序(最新版本2.9)使用FindAsync(filter)命令查找集合中的单个项(集合中只有两个项) 使用synchronousFind(filter).SingleOrDefault()函数可以很好地工作(我对名称字段有一个简单的FilterDefinition),同
FindAsync(filter)
命令查找集合中的单个项(集合中只有两个项)
使用synchronousFind(filter).SingleOrDefault()
函数可以很好地工作(我对名称字段有一个简单的FilterDefinition),同时调用驱动程序的其他(创建)异步函数(如InsertOneAsync)也可以很好地工作
我还通过MongoClientSettings.ClusterConfiguration
和SingleEventSubscribers
(以及其他命令)订阅连接到客户端调用。控制台输出清楚地告诉我FindAsync操作成功。它会找到正确的单个集合项
这是我的异步函数(在我的泛型类中):
我调试了我的应用程序,但它从未从FindAsync调用返回,我也不知道为什么。构造函数不应该接触数据库或进行任何危险的操作。提示:任何时候在异步代码中使用
.Result
,都可能是做错了。这可能会导致死锁。我很确定.Result会阻止当前上下文,不允许调用返回,这将导致异步死锁,因为您在WPF应用程序中。是的,这里的人是对的。你正在做的是导致死锁的syncoverasync(更多信息,请搜索这个术语)。使用等待
而不是。结果
。如果由于某种原因无法使用ConfigureAwait(false)
@Artur,则不能在构造函数中使用await
。最终,这段代码不属于那里。您可以生成一个新任务来执行Get调用,这样您就可以等待它是否必须从构造函数启动
public async Task<T> GetAsync(FilterDefinition<T> filter)
{
var cursor = await Collection.FindAsync(filter);
return await cursor.SingleOrDefaultAsync().ConfigureAwait(false);
}
item = CollectionClass.GetAsync(nameFilter).Result;