c# - 我使用 MongoDB C# 驱动程序 FindAsync 的方式有缺陷吗?
问题描述
对 C# 来说还是有点新。我的代码给了我想要的结果,但我不确定我是否以一种好的方式实现了它。如果您想回答,请详细说明。我的目标是通过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;
}
这是我在 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
(但如何)?我读过一些你应该使用的东西:
配置等待(假)
如何以及为什么?
如此友善,并帮助我了解更多。感谢您的时间。:)
解决方案
这看起来很奇怪
var result = await (_collection.FindAsync(filter).Result.ToListAsync());
应该是
var result = await ((await _collection.FindAsync(filter)).ToListAsync());
使用.Result
for 任务将阻塞,直到任务完成。由于线程在 UI 应用程序中的工作方式,这很有可能导致死锁。所以建议避免.Result
,.Wait()
除非你确定不会发生死锁。
推荐阅读
- python - 有没有办法将 csv 保存为新的 csv 而不会覆盖旧的?
- c++ - 如果给定一个命名捕获,如 [copy=val](){},C++ 将 lambda 浅复制 const Type& 吗?
- postman - 带有预请求脚本的邮递员:“错误:解析错误:标头溢出”
- ios - Swift 协议一致性问题
- reactjs - 超过 1 个实例时 React-Tabulator 组件崩溃
- javascript - 调用函数Angular 9后值不会分配给数组
- qt - 如何在 qml chartview 中使 x 轴位于 y = 0 上
- sql - 如何在 PostgresSQL 中提取数据?
- heatmap - 叶热图未正确着色
- php - Google Storage signedUploadUrl,获取上传网址返回:错误的内容类型。请使用多部分