我使用 MongoDB C# 驱动程序 FindAsync 的方式有缺陷吗?
Is my way of using MongoDB C# driver FindAsync flawed?
对 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)
如何以及为什么?
请多多关照,帮助我了解更多。感谢您的时间。 :)
这看起来很奇怪
var result = await (_collection.FindAsync(filter).Result.ToListAsync());
应该是
var result = await ((await _collection.FindAsync(filter)).ToListAsync());
对任务使用 .Result
将阻塞,直到任务完成。由于线程在 UI 应用程序中的工作方式,这很有可能导致死锁。所以建议避免.Result
和.Wait()
,除非你确定不会出现死锁。
您不能在该方法上使用 ConfigureAwait(false)
,因为您需要在 await
.
之后返回到捕获的同步上下文(UI 线程)
对 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)
如何以及为什么?
请多多关照,帮助我了解更多。感谢您的时间。 :)
这看起来很奇怪
var result = await (_collection.FindAsync(filter).Result.ToListAsync());
应该是
var result = await ((await _collection.FindAsync(filter)).ToListAsync());
对任务使用 .Result
将阻塞,直到任务完成。由于线程在 UI 应用程序中的工作方式,这很有可能导致死锁。所以建议避免.Result
和.Wait()
,除非你确定不会出现死锁。
您不能在该方法上使用 ConfigureAwait(false)
,因为您需要在 await
.