Appel de méthodes asynchrones directement depuis Main : un guide complet
L'une des améliorations significatives introduites en C# est le modèle async/await, qui simplifie le développement d’opérations asynchrones. Cependant, appeler des méthodes asynchrones directement depuis Main() peut être un peu délicat.
Pour comprendre le problème, considérez l'exemple de code suivant :
public class test { public async Task Go() { await PrintAnswerToLife(); Console.WriteLine("done"); } public async Task PrintAnswerToLife() { int answer = await GetAnswerToLife(); Console.WriteLine(answer); } public async Task<int> GetAnswerToLife() { await Task.Delay(5000); int answer = 21 * 2; return answer; } }
Si vous essayez d'appeler la méthode Go de Main() comme ceci :
class Program { static void Main(string[] args) { test t = new test(); t.Go().GetAwaiter().OnCompleted(() => { Console.WriteLine("finished"); }); Console.ReadKey(); } }
Vous pourriez rencontrer une situation de blocage, empêchant toute sortie d'apparaître à l'écran.
La résolution réside en modifiant Main() pour devenir elle-même une méthode asynchrone. Pour les versions de C# à partir de 7.1 :
static async Task Main(string[] args) { test t = new test(); await t.Go(); Console.WriteLine("finished"); Console.ReadKey(); }
Cette approche permet aux opérations asynchrones de s'exécuter de manière transparente sans aucun blocage du thread principal.
Dans le cas où vous utilisez une version antérieure de C# , vous pouvez utiliser le code suivant :
static void Main(string[] args) { test t = new test(); t.Go().Wait(); Console.WriteLine("finished"); Console.ReadKey(); }
Ici, la méthode Wait() bloque explicitement le thread principal jusqu'à ce que la méthode Go se termine.
N'oubliez pas qu'en adoptant le modèle async/wait, vous pouvez éviter la complexité des rappels, ce qui entraîne un code plus propre et plus maintenable pour les opérations asynchrones.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!