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

nog*_*ood 0 c# using-statement winforms async-await mongodb-.net-driver

对于 C# 来说还是比较陌生。我的代码给了我想要的结果,但我不确定我是否以正确的方式实现了它。如果您想回答,请详细说明。我的目标是通过 搜索我的 MongoDB 中的条目FindAsync。这是我的代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

这是我在 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

这安全吗?我不应该使用 a using(但如何使用)?我读过一些关于你应该使用的内容:

配置等待(假)

如何以及为何?

非常友善,帮助我了解更多。感谢您的时间。:)

Jon*_*asH 5

这看起来很奇怪

var result = await (_collection.FindAsync(filter).Result.ToListAsync());
Run Code Online (Sandbox Code Playgroud)

大概应该是

var result = await ((await _collection.FindAsync(filter)).ToListAsync());
Run Code Online (Sandbox Code Playgroud)

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