¿Por qué no puedo depurar código en un método asíncrono?

De hecho, comencé la noche tratando de aprender más sobre MongoDB, pero me estoy quedando colgado y .NET espera / async cosas. Estoy tratando de implementar el código que se muestra en el sitio de MongoDB. He tenido que modificarlo un poco, para poder comstackr mi progtwig. Sé que tengo la siguiente aplicación de mi consola.

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 } 

Cuando ejecuto la aplicación, el depurador llamará a mi método GetDataAsync (), que a su vez llamará al método GetData (). Llega a la línea “using (var cursor = await collection.FindAsync (filter))” y luego regresa inmediatamente para finalizar el método main ().

Los puntos de ruptura que coloco debajo de esa línea se ignoran, al igual que los puntos de ruptura que coloco en el método GetDataAsync (). ¿Este código simplemente no se ejecuta porque el progtwig sale? ¿Puede alguien explicarme lo que está pasando?

Porque no estás esperando tu método GetDataAsync . Cuando se alcanza la primera await el hilo se devuelve a la persona que llama. Dado que no está esperando la finalización de la tarea, no se puede salir de la aplicación de la consola y su punto de interrupción. También deberá actualizar el método GetDataAsync para devolver una Task lugar de anularla. No puedes esperar el vacío. Debe evitar el uso de async void para cualquier otra cosa que no sea el controlador de eventos.

 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 }