C# Mongo FirstOrDefaultAsync 卡住了

4

使用2.0驱动程序时,以下代码有时会挂起且永远不会返回。

public async Task<T> GetFirst(FilterDefinition<T> query)
{
    return await GetCollection.Find(query).FirstOrDefaultAsync();
}

如果我在返回代码的行上设置断点,一切都会正常返回。在 shell 中运行的查询大致如下:

db.Customers.find({"Name" : /test$/i})

2
你可能需要在调用的末尾添加一个ConfigureAwait,以避免死锁主线程。return await GetCollection.Find(query).FirstOrDefaultAsync().ConfigureAwait(false); - Craig Wilson
1
然而,在这种情况下,你其实没有必要使用async和await关键字...只需返回GetCollection.Find(query).FirstOrDefaultAsync()即可。 - Craig Wilson
移除async和await后,代码可以正常工作...不确定原因,我猜测是因为FirstOrDefaultAsync需要一个await标志。 - Chadit
1
你是如何调用GetFirst()的?你是使用类似于GetFirst(query).Result这样的方式吗? - svick
我使用await标志调用GetFirst方法,类似这样 await repo.GetFirst(filterQuery); - Chadit
1个回答

8
有两种解决方案:
  1. Add a ConfigureAwait(false) at the end:

    return await GetCollection.Find(query).FirstOrDefaultAsync().ConfigureAwait(false);
    
  2. Just return the Task<T>, since the result of FirstOrDefaultAsync() is the same type as the result you want to return.

    public Task<T> GetFirst(FilterDefinition<T> query)
    {
        return GetCollection.Find(query).FirstOrDefaultAsync();
    }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接