Console Application de Résiliation Avant l'Appel asynchrone de l'Achèvement
Je suis actuellement à la rédaction d'un C# console application qui génère un certain nombre d'URLs qui pointent vers différentes images sur un site web et télécharge que les flux d'octets à l'aide de WebClient.DownloadDataAsync()
.
Mon problème est que une fois le premier appel asynchrone est fait, l'application de console estime que le programme soit terminé et se termine avant que l'appel asynchrone peut revenir. À l'aide d'un Console.Read()
je peux forcer la console reste ouverte, mais cela ne semble pas être très bonne conception. En outre, si l'utilisateur appuie sur entrée pendant le processus (alors que la console est en attente d'entrée), le programme prendra fin.
Est-il une meilleure façon de prévenir la console à partir de la clôture alors que je suis en attente d'un appel asynchrone de retour?
Edit: les appels sont asynchrones parce que je suis en fournissant un indicateur de l'état via la console de l'utilisateur alors que les téléchargements de prendre place.
Vous devez vous connecter pour publier un commentaire.
Oui. Utiliser un ManualResetEvent, et ont async rappel appel
event.Set()
. Si la routine Principale blocs surevent.WaitOne()
, il ne sera pas quitter jusqu'à ce que le code asynchrone est terminée.La base des pseudo-code devrait ressembler à:
Task
que l'intervenant de première ligne. DansProgram.Main()
, à l'aide d'un pré-processeur de la directive comme#if DEBUG [debug hook] #else [normal service code] #endif
, puis dans le "debug crochet", je viens d'ajouter un appel àresetEvent.WaitOne()
aprèsnew MyService().OnStart()
. Ensuite, vous pouvez utiliser VS debug continu en mode de débogage sans modification de votre code de service de manière significative.Une autre option est de simplement appeler un async méthode Principale et d'attente de la tâche retourné.
Depuis .NET 4.5, vous pouvez maintenant appeler
GetAwaiter().GetResult()
Quelle est la différence entre les deux .Wait() vs .GetAwaiter().GetResult()?
Si votre application est en train de faire, je suggère de laisser de l'appel asynchrone; vous spécifiquement voulez à l'application de "bloquer" jusqu'à ce que le téléchargement est terminé, donc à l'aide d'une opération asynchrone est contraire à ce que vous voulez ici, en particulier dans une application console.
Il convient de constater qu'en C# 7.1
Main
peut maintenant être marqué commeasync
.