Pourquoi ne puis-je pas déboguer du code dans une méthode asynchrone?
J'ai en fait commencé la nuit à essayer d'en apprendre plus sur MongoDB, mais je suis arriver a raccroché et le .NET vous attendent/async choses. Je suis en train de mettre en œuvre le code indiqué sur MongoDB est site. J'ai eu à le modifier un peu, afin que je puisse obtenir mon programme à compiler. Je sais avoir la suite de mon application console.
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
}
Quand je lance l'application, le débogueur s'appeler dans mon GetDataAsync() méthode qui appelle à son tour dans la méthode GetData (). Il arrive à la ligne "using (var curseur = attendent la collection.FindAsync(filtre))" et puis retourne immédiatement à la finition de la méthode main ().
De tout casser points que j'ai mis en dessous de cette ligne sont ignorés, comme le sont tous les points d'arrêt, j'ai mis dans le GetDataAsync() la méthode. Est-ce code tout simplement pas l'obtenir parce que les sorties de programme? Quelqu'un peut m'expliquer ce qui se passe?
source d'informationauteur Dave
Vous devez vous connecter pour publier un commentaire.
Parce que vous n'êtes pas d'attente de votre
GetDataAsync
méthode. Lors de la premièreawait
est atteint, le thread est retourné à l'appelant. Depuis votre pas attendre l'achèvement de la tâche, votre application de console de sortie et le point d'arrêt n'est pas atteint. Vous aurez également besoin de mettre à jour leGetDataAsync
méthode pour renvoyer uneTask
plutôt que vide. Vous ne pouvez pas attendre vide. Vous devriez évitez d'utiliser des async void pour autre chose que le gestionnaire d'événement.