2 votes

C# : l'appel d'une méthode asynchrone à l'intérieur d'une application console entraîne un échec de la compilation

J'ai un extrait de code très simple, pour tester comment appeler la méthode Task<> dans Main()

using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
    private static async Task<int> F1(int wait = 1)
    {
        await Task.Run(() => Thread.Sleep(wait));
        Console.WriteLine("finish {0}", wait);
        return 1;
    }

    public static async void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
        var task = F1();
        int f1 = await task;
        Console.WriteLine(f1);
    }
}

Il ne compile pas parce que :

(1) F1 est asynchrone, donc Main() doit être "asynchrone".

(2) Le compilateur dit :

error CS5001: Program does not contain a static 'Main' method suitable for an entry point

Ainsi, si je supprime le "async" de Main, le compilateur dira :

error CS4033: The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'.

Je peux ajouter ou supprimer le mot-clé "async" ici. Comment faire pour que cela fonctionne ? Merci beaucoup.

10voto

Johnathan Barclay Points 1890

Votre Main n'est pas conforme à l'une des signatures valides répertoriées aquí .

Vous voudrez probablement utiliser ceci :

public static async Task Main(string[] args)

A Task doit être renvoyée, afin que le système d'exécution sache quand la méthode est terminée ; cela ne pouvait pas être déterminé avec la méthode void .

Le compilateur y parvient en générant un point d'entrée synthétique :

private static void $GeneratedMain(string[] args) => 
    Main(args).GetAwaiter().GetResult();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X