Dav*_*ave 26 c# asynchronous mongodb
我实际上开始尝试了解有关MongoDB的更多信息,但是我已经挂断了.NET等待/异步的东西.我正在尝试实现MongoDB 网站上显示的代码.我不得不稍微修改它,所以我可以让我的程序编译.我知道有以下我的控制台应用程序.
protected static IMongoClient _client;
protected static IMongoDatabase _database;
static void Main(string[] args)
{
_client = new MongoClient();
_database = _client.GetDatabase("test");
GetDataAsync();
}
private static async void GetDataAsync() //method added by me.
{
int x = await GetData();
}
private static async Task<int> GetData()
{
var collection = _database.GetCollection<BsonDocument>("restaurants");
var filter = new BsonDocument();
var count = 0;
Func<int> task = () => count; //added by me.
var result = new Task<int>(task); //added by me.
using (var cursor = await collection.FindAsync(filter)) //Debugger immediately exits here, goes back to main() and then terminates.
{
while (await cursor.MoveNextAsync())
{
var batch = cursor.Current;
foreach (var document in batch)
{
// process document
count++;
}
}
}
return count; //added by me
}
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序时,调试器将调用我的GetDataAsync()方法,该方法又调用GetData()方法.它到达"using(var cursor = await collection.FindAsync(filter))"行,然后立即返回以完成main()方法.
我放在该行下面的任何断点都被忽略,我在GetDataAsync()方法中放置的断点也是如此.此代码是否因为程序退出而无法运行?有人可以向我解释发生了什么事吗?
Fab*_*NET 35
因为你不等你的GetDataAsync方法.当第一个await到达时,线程返回给调用者.由于您没有等待任务完成,因此未达到控制台应用程序退出和断点.您还需要更新GetDataAsync方法以返回Task而不是void.你无法等待无效.除了事件处理程序之外,您应该避免使用async void.
protected static IMongoClient _client;
protected static IMongoDatabase _database;
static void Main(string[] args)
{
_client = new MongoClient();
_database = _client.GetDatabase("test");
GetDataAsync().Wait();
// Will block the calling thread but you don't have any other solution in a console application
}
private static async Task GetDataAsync() //method added by me.
{
int x = await GetData();
}
private static async Task<int> GetData()
{
var collection = _database.GetCollection<BsonDocument>("restaurants");
var filter = new BsonDocument();
var count = 0;
Func<int> task = () => count; //added by me.
var result = new Task<int>(task); //added by me.
using (var cursor = await collection.FindAsync(filter)) //Debugger immediately exits here, goes back to main() and then terminates.
{
while (await cursor.MoveNextAsync())
{
var batch = cursor.Current;
foreach (var document in batch)
{
// process document
count++;
}
}
}
return count; //added by me
}
Run Code Online (Sandbox Code Playgroud)
我不太擅长异步开发,并且遇到了类似的问题,但是我正在启动异步方法,如下所示Main:
Task.Run(async () => await GetDataAsync());
Run Code Online (Sandbox Code Playgroud)
我认为垃圾收集器正在处理匿名方法,因为没有任何东西再引用它。使用 Fabien.Wait()可以让我逐步完成程序并进行调试。我正在使用 netcore 2.1 和 vs2017