【问题标题】:Is my way of using MongoDB C# driver FindAsync flawed?我使用 MongoDB C# 驱动程序 FindAsync 的方式有缺陷吗?
【发布时间】:2021-04-23 16:49:50
【问题描述】:

对于 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(但是如何使用)?我读过一些你应该使用的东西:

配置等待(假)

如何以及为什么?

请善待我,帮助我了解更多。感谢您的时间。 :)

【问题讨论】:

  • 更好的 SearchDocAsync-Methode 会是什么样子?任何示例链接?

标签: c# winforms async-await mongodb-.net-driver using-statement


【解决方案1】:

这看起来很奇怪

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

应该是这样

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

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

【讨论】:

  • 返回等待_collection.Find(filter).ToListAsync();那么这是以异步方式使用 find 的正确方法吗?
  • @nogood 我不熟悉 MongoDb,但这对我来说很好。
【解决方案2】:

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

ConfigureAwait FAQ

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多