为什么我不能在异步方法中调试代码?

我实际上开始尝试了解有关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 GetData() { var collection = _database.GetCollection("restaurants"); var filter = new BsonDocument(); var count = 0; Func task = () => count; //added by me. var result = new Task(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 } 

当我运行应用程序时,调试器将调用我的GetDataAsync()方法,该方法又调用GetData()方法。 它到达“using(var cursor = await collection.FindAsync(filter))”行,然后立即返回以完成main()方法。

我放在该行下面的任何断点都被忽略,就像我在GetDataAsync()方法中放置的任何断点一样。 此代码是否因为程序退出而无法运行? 有人可以向我解释发生了什么事吗?

因为您没有等待GetDataAsync方法。 当达到第一个await时,线程将返回给调用者。 由于您没有等待任务完成,因此您的控制台应用程序退出并未到达断点。 您还需要更新GetDataAsync方法以返回Task而不是void。 你不能等待无效。 除了事件处理程序之外,您应该避免使用异步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 GetData() { var collection = _database.GetCollection("restaurants"); var filter = new BsonDocument(); var count = 0; Func task = () => count; //added by me. var result = new Task(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 }