我使用 MongoDB C# 驱动程序 FindAsync 的方式有缺陷吗?

问题描述

对 C# 来说仍然是新手。我的代码给了我想要的结果,但我不确定我是否以一种好的方式实现了它。如果您想回答,请详细说明。 我的目标是通过 FindAsync 在我的 MongoDB 中搜索条目。这是我的代码

public async Task<List<T>> SearchDocAsync<T,U>(string collection,string findFieldName,U findValue)
{
    var _collection = db.GetCollection<T>(collection);
    var filter = Builders<T>.Filter.Eq(findFieldName,findValue);
    var result = await (_collection.FindAsync(filter).Result.ToListAsync());
    return result;
}

这是我在 WinForms 中调用它的方式:

private async void BtnReadAll_Click(object sender,EventArgs e)
{
    var asyncResults = await myMongoAux.SearchDocAsync<MyTModel,string>(
        myCollectionName,"MyDBString","TestString");
    foreach (var r in asyncResults)
    {
        RtxbxResult.Text += $"{r.MyDBInt}\t{r.MyDBString}\n";
    }
}

这样安全吗?我不应该使用 using(但如何使用)?我已经阅读了一些关于您应该使用的内容

ConfigureAwait(false)

如何以及为什么?

请客气点,帮我了解更多。感谢您的时间。 :)

解决方法

您不能在该方法上使用 ConfigureAwait(false),因为您需要在 await 之后返回到捕获的同步上下文(UI 线程)。

ConfigureAwait FAQ

,

这看起来很奇怪

var result = await (_collection.FindAsync(filter).Result.ToListAsync());

应该是

var result = await ((await _collection.FindAsync(filter)).ToListAsync());

对任务使用 .Result 会阻塞,直到任务完成。由于线程在 UI 应用程序中的工作方式,这很有可能导致死锁。因此建议避免使用 .Result.Wait(),除非您确定不会发生死锁。